Почему распаковка ISO 8583 дает неверные значения?

Мне нужно распаковать и получить MTI, представить значения элементов данных

303831308220000002000000040000000000000031313233303930323333303733313536303033303

1 строка сообщения. Итак, как вы видите, MTI должен быть 3038. Но когда я получаю значение MTI с помощью оператора isoMsg.getMTI();, он дает 0810 в качестве вывода. Итак, в чем проблема с моим кодом? Пожалуйста, ознакомьтесь с этим руководством.https://kodejava.org/how-do-i-unpack-an-iso-8583-message/ Там первые четыре поля отображаются как MTI, но я не получаю свои первые четыре поля как MTI .Пожалуйста, дайте подробный ответ.

public class IsoUnpacker {

    public static void main(String[] args) {
        String message = "3038313082200000020000000400000000000000313132333039303233333037333135363030333031";

        IsoUnpacker iso = new IsoUnpacker();
        try {
            ISOMsg isoMsg = iso.parseISOMessage(message);
            iso.printISOMessage(isoMsg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private ISOMsg parseISOMessage(String message) throws Exception {

        System.out.printf("Message = %s%n", message);
        try {


            ISOMsg isoMsg= new ISOMsg();

            GenericValidatingPackager packager  = new GenericValidatingPackager();
            packager.readFile("C:\\Users\\Hasindu\\Documents\\ISO_Unpacker\\iso_unpacking\\src\\resources\\fields.xml");

            isoMsg.setPackager(packager);
            isoMsg.unpack(ISOUtil.hex2byte(message));


            return isoMsg;
        } catch (ISOException e) {
            System.out.println(e.getMessage());
        }
        return null ;
    }

    private void printISOMessage(ISOMsg isoMsg) {
        try {
            System.out.printf("MTI = %s%n", isoMsg.getMTI());
            for (int i = 1; i <= isoMsg.getMaxField(); i++) {
                if (isoMsg.hasField(i)) {
                    System.out.printf("Field (%s) = %s%n", i, isoMsg.getString(i));
                }
            }
        } catch (ISOException e) {
            e.printStackTrace();
        }
    }
}

файл fields.xml

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<!DOCTYPE isopackager PUBLIC
        "-//jPOS/jPOS Generic Packager DTD 1.0//EN"
        "http://jpos.org/dtd/generic-packager-1.0.dtd">

<!-- ISO 8583:1987 (ASCII) field descriptions for GenericPackager -->
<!-- Bitmap is BINARY in this case -->

<isopackager>
    <isofield
            id = "0"
            length = "4"
            name = "MESSAGE TYPE INDICATOR"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "1"
            length = "16"
            name = "BIT MAP"
            class = "org.jpos.iso.IFB_BITMAP"/>
    <isofield
            id = "2"
            length = "19"
            name = "PAN - PRIMARY ACCOUNT NUMBER"
            class = "org.jpos.iso.IFA_LLNUM"/>
    <isofield
            id = "3"
            length = "6"
            name = "PROCESSING CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "4"
            length = "12"
            name = "AMOUNT, TRANSACTION"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "5"
            length = "12"
            name = "AMOUNT, SETTLEMENT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "6"
            length = "12"
            name = "AMOUNT, CARDHOLDER BILLING"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "7"
            length = "10"
            name = "TRANSMISSION DATE AND TIME"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "8"
            length = "8"
            name = "AMOUNT, CARDHOLDER BILLING FEE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "9"
            length = "8"
            name = "CONVERSION RATE, SETTLEMENT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "10"
            length = "8"
            name = "CONVERSION RATE, CARDHOLDER BILLING"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "11"
            length = "6"
            name = "SYSTEM TRACE AUDIT NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "12"
            length = "6"
            name = "TIME, LOCAL TRANSACTION"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "13"
            length = "4"
            name = "DATE, LOCAL TRANSACTION"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "14"
            length = "4"
            name = "DATE, EXPIRATION"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "15"
            length = "4"
            name = "DATE, SETTLEMENT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "16"
            length = "4"
            name = "DATE, CONVERSION"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "17"
            length = "4"
            name = "DATE, CAPTURE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "18"
            length = "4"
            name = "MERCHANTS TYPE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "19"
            length = "3"
            name = "ACQUIRING INSTITUTION COUNTRY CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "20"
            length = "3"
            name = "PAN EXTENDED COUNTRY CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "21"
            length = "3"
            name = "FORWARDING INSTITUTION COUNTRY CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "22"
            length = "3"
            name = "POINT OF SERVICE ENTRY MODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "23"
            length = "3"
            name = "CARD SEQUENCE NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "24"
            length = "3"
            name = "NETWORK INTERNATIONAL IDENTIFIEER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "25"
            length = "2"
            name = "POINT OF SERVICE CONDITION CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "26"
            length = "2"
            name = "POINT OF SERVICE PIN CAPTURE CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "27"
            length = "1"
            name = "AUTHORIZATION IDENTIFICATION RESP LEN"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "28"
            length = "9"
            name = "AMOUNT, TRANSACTION FEE"
            class = "org.jpos.iso.IFA_AMOUNT"/>
    <isofield
            id = "29"
            length = "9"
            name = "AMOUNT, SETTLEMENT FEE"
            class = "org.jpos.iso.IFA_AMOUNT"/>
    <isofield
            id = "30"
            length = "9"
            name = "AMOUNT, TRANSACTION PROCESSING FEE"
            class = "org.jpos.iso.IFA_AMOUNT"/>
    <isofield
            id = "31"
            length = "9"
            name = "AMOUNT, SETTLEMENT PROCESSING FEE"
            class = "org.jpos.iso.IFA_AMOUNT"/>
    <isofield
            id = "32"
            length = "11"
            name = "ACQUIRING INSTITUTION IDENT CODE"
            class = "org.jpos.iso.IFA_LLNUM"/>
    <isofield
            id = "33"
            length = "11"
            name = "FORWARDING INSTITUTION IDENT CODE"
            class = "org.jpos.iso.IFA_LLNUM"/>
    <isofield
            id = "34"
            length = "28"
            name = "PAN EXTENDED"
            class = "org.jpos.iso.IFA_LLCHAR"/>
    <isofield
            id = "35"
            length = "37"
            name = "TRACK 2 DATA"
            class = "org.jpos.iso.IFA_LLNUM"/>
    <isofield
            id = "36"
            length = "104"
            name = "TRACK 3 DATA"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "37"
            length = "12"
            name = "RETRIEVAL REFERENCE NUMBER"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "38"
            length = "6"
            name = "AUTHORIZATION IDENTIFICATION RESPONSE"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "39"
            length = "2"
            name = "RESPONSE CODE"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "40"
            length = "3"
            name = "SERVICE RESTRICTION CODE"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "41"
            length = "8"
            name = "CARD ACCEPTOR TERMINAL IDENTIFICACION"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "42"
            length = "15"
            name = "CARD ACCEPTOR IDENTIFICATION CODE"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "43"
            length = "40"
            name = "CARD ACCEPTOR NAME/LOCATION"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "44"
            length = "25"
            name = "ADITIONAL RESPONSE DATA"
            class = "org.jpos.iso.IFA_LLCHAR"/>
    <isofield
            id = "45"
            length = "76"
            name = "TRACK 1 DATA"
            class = "org.jpos.iso.IFA_LLCHAR"/>
    <isofield
            id = "46"
            length = "999"
            name = "ADITIONAL DATA - ISO"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "47"
            length = "999"
            name = "ADITIONAL DATA - NATIONAL"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "48"
            length = "999"
            name = "ADITIONAL DATA - PRIVATE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "49"
            length = "3"
            name = "CURRENCY CODE, TRANSACTION"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "50"
            length = "3"
            name = "CURRENCY CODE, SETTLEMENT"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "51"
            length = "3"
            name = "CURRENCY CODE, CARDHOLDER BILLING"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "52"
            length = "8"
            name = "PIN DATA"
            class = "org.jpos.iso.IFA_BINARY"/>
    <isofield
            id = "53"
            length = "16"
            name = "SECURITY RELATED CONTROL INFORMATION"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "54"
            length = "120"
            name = "ADDITIONAL AMOUNTS"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "55"
            length = "999"
            name = "RESERVED ISO"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "56"
            length = "999"
            name = "RESERVED ISO"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "57"
            length = "999"
            name = "RESERVED NATIONAL"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "58"
            length = "999"
            name = "RESERVED NATIONAL"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "59"
            length = "999"
            name = "RESERVED NATIONAL"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "60"
            length = "999"
            name = "RESERVED PRIVATE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "61"
            length = "999"
            name = "RESERVED PRIVATE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "62"
            length = "999"
            name = "RESERVED PRIVATE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "63"
            length = "999"
            name = "RESERVED PRIVATE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "64"
            length = "8"
            name = "MESSAGE AUTHENTICATION CODE FIELD"
            class = "org.jpos.iso.IFA_BINARY"/>
    <isofield
            id = "65"
            length = "1"
            name = "BITMAP, EXTENDED"
            class = "org.jpos.iso.IFA_BINARY"/>
    <isofield
            id = "66"
            length = "1"
            name = "SETTLEMENT CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "67"
            length = "2"
            name = "EXTENDED PAYMENT CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "68"
            length = "3"
            name = "RECEIVING INSTITUTION COUNTRY CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "69"
            length = "3"
            name = "SETTLEMENT INSTITUTION COUNTRY CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "70"
            length = "3"
            name = "NETWORK MANAGEMENT INFORMATION CODE"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "71"
            length = "4"
            name = "MESSAGE NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "72"
            length = "4"
            name = "MESSAGE NUMBER LAST"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "73"
            length = "6"
            name = "DATE ACTION"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "74"
            length = "10"
            name = "CREDITS NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "75"
            length = "10"
            name = "CREDITS REVERSAL NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "76"
            length = "10"
            name = "DEBITS NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "77"
            length = "10"
            name = "DEBITS REVERSAL NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "78"
            length = "10"
            name = "TRANSFER NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "79"
            length = "10"
            name = "TRANSFER REVERSAL NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "80"
            length = "10"
            name = "INQUIRIES NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "81"
            length = "10"
            name = "AUTHORIZATION NUMBER"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "82"
            length = "12"
            name = "CREDITS, PROCESSING FEE AMOUNT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "83"
            length = "12"
            name = "CREDITS, TRANSACTION FEE AMOUNT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "84"
            length = "12"
            name = "DEBITS, PROCESSING FEE AMOUNT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "85"
            length = "12"
            name = "DEBITS, TRANSACTION FEE AMOUNT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "86"
            length = "16"
            name = "CREDITS, AMOUNT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "87"
            length = "16"
            name = "CREDITS, REVERSAL AMOUNT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "88"
            length = "16"
            name = "DEBITS, AMOUNT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "89"
            length = "16"
            name = "DEBITS, REVERSAL AMOUNT"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "90"
            length = "42"
            name = "ORIGINAL DATA ELEMENTS"
            class = "org.jpos.iso.IFA_NUMERIC"/>
    <isofield
            id = "91"
            length = "1"
            name = "FILE UPDATE CODE"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "92"
            length = "2"
            name = "FILE SECURITY CODE"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "93"
            length = "6"
            name = "RESPONSE INDICATOR"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "94"
            length = "7"
            name = "SERVICE INDICATOR"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "95"
            length = "42"
            name = "REPLACEMENT AMOUNTS"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "96"
            length = "16"
            name = "MESSAGE SECURITY CODE"
            class = "org.jpos.iso.IFA_BINARY"/>
    <isofield
            id = "97"
            length = "17"
            name = "AMOUNT, NET SETTLEMENT"
            class = "org.jpos.iso.IFA_AMOUNT"/>
    <isofield
            id = "98"
            length = "25"
            name = "PAYEE"
            class = "org.jpos.iso.IF_CHAR"/>
    <isofield
            id = "99"
            length = "11"
            name = "SETTLEMENT INSTITUTION IDENT CODE"
            class = "org.jpos.iso.IFA_LLNUM"/>
    <isofield
            id = "100"
            length = "11"
            name = "RECEIVING INSTITUTION IDENT CODE"
            class = "org.jpos.iso.IFA_LLNUM"/>
    <isofield
            id = "101"
            length = "17"
            name = "FILE NAME"
            class = "org.jpos.iso.IFA_LLCHAR"/>
    <isofield
            id = "102"
            length = "28"
            name = "ACCOUNT IDENTIFICATION 1"
            class = "org.jpos.iso.IFA_LLCHAR"/>
    <isofield
            id = "103"
            length = "28"
            name = "ACCOUNT IDENTIFICATION 2"
            class = "org.jpos.iso.IFA_LLCHAR"/>
    <isofield
            id = "104"
            length = "100"
            name = "TRANSACTION DESCRIPTION"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "105"
            length = "999"
            name = "RESERVED ISO USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "106"
            length = "999"
            name = "RESERVED ISO USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "107"
            length = "999"
            name = "RESERVED ISO USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "108"
            length = "999"
            name = "RESERVED ISO USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "109"
            length = "999"
            name = "RESERVED ISO USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "110"
            length = "999"
            name = "RESERVED ISO USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "111"
            length = "999"
            name = "RESERVED ISO USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "112"
            length = "999"
            name = "RESERVED NATIONAL USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "113"
            length = "999"
            name = "RESERVED NATIONAL USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "114"
            length = "999"
            name = "RESERVED NATIONAL USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "115"
            length = "999"
            name = "RESERVED NATIONAL USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "116"
            length = "999"
            name = "RESERVED NATIONAL USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "117"
            length = "999"
            name = "RESERVED NATIONAL USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "118"
            length = "999"
            name = "RESERVED NATIONAL USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "119"
            length = "999"
            name = "RESERVED NATIONAL USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "120"
            length = "999"
            name = "RESERVED PRIVATE USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "121"
            length = "999"
            name = "RESERVED PRIVATE USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "122"
            length = "999"
            name = "RESERVED PRIVATE USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "123"
            length = "999"
            name = "RESERVED PRIVATE USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "124"
            length = "999"
            name = "RESERVED PRIVATE USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "125"
            length = "999"
            name = "RESERVED PRIVATE USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "126"
            length = "999"
            name = "RESERVED PRIVATE USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "127"
            length = "999"
            name = "RESERVED PRIVATE USE"
            class = "org.jpos.iso.IFA_LLLCHAR"/>
    <isofield
            id = "128"
            length = "8"
            name = "MAC 2"
            class = "org.jpos.iso.IFA_BINARY"/>
</isopackager>

Выход:

Message = 3038313082200000020000000400000000000000313132333039303233333037333135363030333031
MTI = 0810
Field (7) = 1123090233
Field (11) = 073156
Field (39) = 00
Field (70) = 301

У вас, похоже, проблемы с репрезентацией. Вы обрабатываете входное сообщение как шестнадцатеричное, но где-то есть несоответствие. Обратите внимание, что 30383130 — это шестнадцатеричное значение строки ASCII 0810. Я ничего не знаю об ISO8583, поэтому не могу быть более конкретным, но несоответствие кодировки очевидно.

Jim Garrison 10.12.2020 20:20

@JimGarrison Да, на самом деле я это заметил. Но не смог решить проблему.

Hasindu Dahanayake 10.12.2020 20:25

Я не вижу проблемы в том, что MTI этого сообщения действительно 0810

Andrés Alcarraz 11.12.2020 20:53

@AndrésAlcarraz MTI должно быть 3038, как это может быть 0810

Hasindu Dahanayake 11.12.2020 20:56

потому что это так, 3038 не является допустимым MTI, 0810 является общим MTI и является MTI для ответов на сообщения 0800

Andrés Alcarraz 11.12.2020 21:01

@AndrésAlcarraz Я не понял, должны ли это быть первые четыре поля, я имею в виду, что обычно MTI - это первые четыре поля сообщения, что означает 3038.

Hasindu Dahanayake 12.12.2020 12:26

30=0, 38=8, 31=1 30=0 в ASCII, это первые 4 байта, точно. у вас есть шестнадцатеричное представление байтов ASCII. В вашей входной строке каждые два символа представляют собой шестнадцатеричное представление байта.

Andrés Alcarraz 12.12.2020 16:04

@AndrésAlcarraz Pal, не могли бы вы взглянуть на этот пример .kodejava.org/how-do-i-unpack-an-iso-8583-message . Почему я не могу выполнить те же шаги, чтобы получить вывод. Я имею в виду, что вы можете видеть, что он использовал метод message.getBytes(). Но когда я использовал этот метод, он дает мне исключение во время выполнения. Итак, вместо этого метода Я использовал ISOUtil.hex2byte(сообщение); здесь. Я имею в виду, что вы можете видеть, что он получил первые 4 поля своей входной строки как значение MTI.

Hasindu Dahanayake 12.12.2020 17:53

Все зависит от формата, в этом примере сообщение не является шестнадцатеричным представлением.

Andrés Alcarraz 12.12.2020 23:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
2 588
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Это не полный ответ, но он слишком велик для комментария и может помочь вам разобраться в проблеме.

Примечание:

3038313082200000020000000400000000000000313132333039303233333037333135363030333031

Похоже, это строка ASCII в шестнадцатеричном кодировании с некоторыми двоичными элементами в начале.

Если я конвертирую в ASCII, предполагая, что двоичные биты представляют собой 32-битные целые числа с прямым порядком байтов, я получаю

"0810" ASCII
0x00002082 
0x00000002
0x00000004
0x00000000
"112309023307315600301" ASCII

Надеюсь, это поможет вам разобраться в проблеме.

Да, но я не уверен, как получить 0810 в качестве вывода вместо 3038. Вы говорите о 30383130, а не о 3038.

Hasindu Dahanayake 10.12.2020 20:53

Дело в том, что значение ЕСТЬ 0810. Эта длинная строка не является сообщением, это шестнадцатеричное представление фактического сообщения. Фактическое сообщение представляет собой набор двоичных и строковых объектов данных ASCII, которые я предоставил.

Jim Garrison 10.12.2020 20:57

Это правильное и хорошо сформированное сообщение. MTI 0810 = ответ управления сетью, поле 70, код информации управления сетью, 301 означает эхо-тест, поле 39 = 00 означает ОК, поле 11 — номер аудита трассировки системы, идентификатор сообщения, которое связывает ответ с запросом, а поле 7 - дата и время, 23 ноября, 09:02:33.

Битовая карта 822000000200000004000000000000000. Подсчитайте биты, начиная с 1, и вы получите 1, 7, 11, 39 и 70. Поле 1 — это вторая битовая карта.

ISO 8583 — довольно свободный стандарт, и каждая его реализация немного отличается. Например, у каждого бренда карты есть своя версия. Но этот конкретный пример является стандартным.

Я сравнивал не со ссылкой, которую вы дали, а с версией стандарта.

Попробуй это:

package org.kodejava.example.jpos;

import org.jpos.iso.ISOException;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.packager.GenericPackager;

import java.io.InputStream;

public class IsoUnpacker {
    public static void main(String[] args) {
        IsoUnpacker iso = new IsoUnpacker();
        try {
        String message = "02003220000000808000000010000000001500120604120000000112340001840";
            ISOMsg isoMsg = iso.parseISOMessage(message);
            iso.printISOMessage(isoMsg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private ISOMsg parseISOMessage(String message) throws Exception {
        System.out.printf("Message = %s%n", message);
        try {
            // Load package from resources directory.
            InputStream is = getClass().getResourceAsStream("C:\\Users\\Hasindu\\Documents\\ISO_Unpacker\\iso_unpacking\\src\\resources\\fields.xm");
            GenericPackager packager = new GenericPackager(is);
            ISOMsg isoMsg = new ISOMsg();
            isoMsg.setPackager(packager);
            isoMsg.unpack(message.getBytes());
            return isoMsg;
        } catch (ISOException e) {
            throw new Exception(e);
        }
    }

    private void printISOMessage(ISOMsg isoMsg) {
        try {
            System.out.printf("MTI = %s%n", isoMsg.getMTI());
            for (int i = 1; i <= isoMsg.getMaxField(); i++) {
                if (isoMsg.hasField(i)) {
                    System.out.printf("Field (%s) = %s%n", i, isoMsg.getString(i));
                }
            }
        } catch (ISOException e) {
            e.printStackTrace();
        }
    }
}
Ответ принят как подходящий

В вашем подходе все в порядке, все пытались объяснить одно и то же, но позвольте мне сначала прояснить для вас основы, а затем постараюсь ответить на все ваши вопросы, которые вы задали в ОП или в комментариях.

Понимание ISO 8583 (Отказ от ответственности: мои слова и из Википедии)

Это международный стандарт обмена сообщениями о финансовых транзакциях. Он поставляется с определенным форматом, и многие крупные схемы, такие как MasterCard, Visa, используют его. По определению первые 4 места это MTI -> Message Type Indicator. И так далее там цифры со своими местами имеют определенное значение.

В основном определяя, что это за сообщение? Теперь, как уже упоминалось, это стандартный протокол, который означает, что определены даже действительные MTI. Итак, изучая или понимая ISO 8583, вы должны начать изучать, что такое действительные MTI?

Теперь я настоятельно рекомендую прочитать этот раздел, прежде чем читать дальше: MTI_Wiki

После прочтения вы, возможно, поняли, что индикатор типа сообщения включает версию ISO 8583, класс сообщения, функцию сообщения и источник сообщения. То есть: эти 4 цифры объясняют вышеприведенные 3 вещи.

Взяв пример вашего сообщения: 303831xxxxxxxxxxxxxxxxxxxxxx

Теперь, если мы перейдем к вашему сообщению, а также посмотрим на ссылку, которой я поделился выше, первая цифра 3 в 3038xxсогласно ISO 8583 недоступна для использования и, скорее, зарезервирована самой ISO.

Это означает - то, что вы ожидали изначально как MTI 3038 - это даже не действительный MTI !! что в дальнейшем должно было заставить вас понять, что это либо неправильное сообщение, либо каким-то образом закодированное сообщение.

И в вашем случае это последнее, так как это шестнадцатеричное закодированное сообщение, что совершенно нормально, поскольку многие бизнес-объекты могут иметь любой тип соглашения о выборе.

Сказав это, вы должны понимать, чтобы использовать любую библиотеку ISO чтобы упаковать или распаковать или что-нибудь еще, вы должны сначала перевести свой сообщение в допустимом формате ISO 8583.

Таким образом, ваше решение использовать isoMsg.unpack(ISOUtil.hex2byte(message)); абсолютно справедливо в этой ситуации, и, конечно, это isoMsg.unpack(message.getBytes()); обречено на неудачу, потому что, когда вы говорите message.getBytes(), вы не передаете действительное сообщение ISO 8583 стандартной функции распаковки.

Итак, в вашем сообщении:

Message = 3038313082200000020000000400000000000000313132333039303233333037333135363030333031

Наличие 30383130 (в шестнадцатеричном кодировании) MTI = 0810

Как узнать, является ли сообщение базовым 16 (в шестнадцатеричном кодировании)?

Для этого настоятельно рекомендуется иметь соглашение от инициатора-эквайера/терминала/любого интерфейса, чтобы сообщить потребителю/банку/любому интерфейсу, в каком формате придет сообщение.

Это стандартная практика в организации, таким образом настраиваются ответчики. И я уверен, что от этого инициатора, где вы получаете 303831xxxxxxxxxx , завтра вы не начнете получать 0810xxxx (как в ASCII), если только они не изменят конфигурацию/настройку на своем конце, для чего вы/ваша компания должны быть информированный. Что касается финансовой сделки, чтобы быть успешным, все связанные стороны должны сыграть свою роль.

Я не могу вспомнить какую-либо библиотеку для обнаружения кодировки, конечно, у вас может быть что-то, что может обнаруживать, но все же я бы попросил стандартизировать это как соглашение между сторонами, как я сказал выше.

Совет для профессионалов: со временем вы сами сможете определить кодировку или тип сообщения, просто взглянув на MTI ;)! Поверьте мне!

Надеюсь, я ответил на все ваши сомнения, если больше, не стесняйтесь спрашивать. Удачи!

Большое спасибо за отличное объяснение. Без сомнения, это лучшее объяснение. Я полностью с вами согласен, после публикации этого вопроса в течение нескольких дней в сообществе и из-за отсутствия подробного ответа, подобного вашему, я наконец прояснил эти сомнения через компанию SE, которая является экспертом в этой области. Большинство объяснений (почти все), которые он дал, были такими же, как и ваши.

Hasindu Dahanayake 20.12.2020 09:23

Рад, помогло! Спасибо за высокую оценку. Удачи с ISO 8583, многое еще впереди :) !

Vivek 20.12.2020 11:45

Другие вопросы по теме