Проблема синтаксического анализа JPOS ISO 8583

Я создаю сообщение с ISO 8583 v87! Но при его разборе я получаю разные значения параметров. В чем проблема? Это для Hex.encodeHexString

import org.apache.commons.codec.binary.Hex;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOMsg;

public class ParseISOMessage { 
static org.jpos.iso.packager.ISO87APackager packager;

public static void main(String[] args) throws IOException, ISOException {

    String data  = createMSG();

    // Create Packager based on XML that contain DE type
    packager = new org.jpos.iso.packager.ISO87APackager();

    // Create ISO Message
    ISOMsg isoMsg = new ISOMsg();
    isoMsg.setPackager(packager);       

    isoMsg.unpack(data.getBytes());



    // print the DE list
    logISOMsg(isoMsg);
}

private static void logISOMsg(ISOMsg msg) {
    System.out.println("----ISO MESSAGE-----");
    try {
        System.out.println("  MTI : " + msg.getMTI());
        for (int i=1;i<=msg.getMaxField();i++) {
            if (msg.hasField(i)) {
                System.out.println("    Field-"+i+" ("+packager.getFieldPackager(i).getDescription()+") : "+msg.getString(i));
            }
        }
    } catch (ISOException e) {
        e.printStackTrace();
    } finally {
        System.out.println("--------------------");
    }

}

private static String createMSG() {
    try{
        ISO87BPackager packager = new ISO87BPackager();
        ISOMsg isoMsg = new ISOMsg();
        isoMsg.setPackager(packager);
        isoMsg.setMTI("0200");
        isoMsg.set(2, "1234567890123456");
        isoMsg.set(3, "000000");
        isoMsg.set(4,"000000001234");
        isoMsg.set(7, "0413135553");
        isoMsg.set(11, "000091");
        isoMsg.set(12, "135553");
        isoMsg.set(13, "0413");
        isoMsg.set(25, "14");
        isoMsg.set(32, "5816720610");
        isoMsg.set(35, "1234567890123456=9505146000000000000");
        isoMsg.set(37, "000000000000");
        isoMsg.set(41,"55555555");
        isoMsg.set(49,"123");
        isoMsg.set(52,"1A2B3C4D5E6F7012");
        isoMsg.set(64,"ABCDEF0123456789");
        byte[] b = isoMsg.pack();
        System.out.println("**"+Hex.encodeHexString(b)+"**");
        return Hex.encodeHexString(b);
    }
    catch(Exception ex) {
        ex.printStackTrace();
        return "";
    }
}
}

например, я установил ДАННЫЕ ПИН-кода как ABCDEF0123456789, но при синтаксическом анализе созданного сообщения ДАННЫЕ ПИН-кода равнялись 0353535353535353.


person Majid Hajibaba    schedule 13.08.2017    source источник
comment
Можете ли вы ограничить тест только обработкой Hex и String?   -  person Konrad    schedule 13.08.2017


Ответы (1)


Вопрос довольно прост, когда вы вызываете data.getBytes(), данные являются фактически закодированными шестнадцатеричными данными, а не данными, созданными isoMsg.pack().

Изменения isoMsg.unpack(data.getBytes())

to

    final byte[] bytes = new Hex().decode(data.getBytes());
    isoMsg.unpack(bytes);

Также вы должны использовать тот же packager для упаковки и распаковки.


public class ParseISOMessage {

    private static org.jpos.iso.packager.ISO87APackager packager = new org.jpos.iso.packager.ISO87APackager();

    public static void main(String[] args) throws IOException, ISOException, DecoderException {
        String data = createMSG();
        // Create ISO Message
        ISOMsg isoMsg = new ISOMsg();
        isoMsg.setPackager(packager);
        final byte[] bytes = new Hex().decode(data.getBytes());
        isoMsg.unpack(bytes);
    ...
    private static String createMSG() {
        try {
//            ISO87BPackager packager = new ISO87BPackager(); // delete this line otherwise it cannot unpack
            ISOMsg isoMsg = new ISOMsg();
            isoMsg.setPackager(packager);
            isoMsg.setMTI("0200");
           ...//same
            isoMsg.set(64, "ABCDEF0123456789");
            byte[] b = isoMsg.pack();
            System.out.println("**" + new String(Hex.encodeHex(b, false)) + "**"); // make the result uppercase.
            return Hex.encodeHexString(b);
        } catch (Exception ex) {
            ex.printStackTrace();
            return "";
        }
    }
}
person aristotll    schedule 13.08.2017