jPOS — F35 Track 2 — Как упаковать двоичную длину 1 байт с данными BCD, включая разделитель CHAR?

Так что я освоился с jPOS, не являясь экспертом ни в каком смысле.

Моя спецификация определила F35 Track 2 следующим образом:

"Variable Length, 1 byte binary + 37 N, 4-bit BCD (unsigned packed); maximum 20 bytes"

Поэтому я определил это поле в своем GenericPackager:

 <isofield
      id="35"
      length="37"
      name="TRACK 2 DATA"
      pad="true"
      class="org.jpos.iso.IFB_LLHNUM"/>

Насколько я понимаю, B для упакованного двоичного кодирования, LL для переменной длины 37, H отправляет длину в виде 1-байтового двоичного кода, а NUM для числовых данных, следующих за длиной.

Это правильно?

Итак, в моем проекте у меня есть следующий код:

    ISOPackager packager = new GenericPackager("src/main/resources/vapsms_modified.xml");
    BaseChannel channel = new VAPChannel(host, port, packager);

    channel.connect();

    ISOMsg msg = new ISOMsg();
    msg.setPackager(packager);

    msg.setMTI("0100");
    ...
    msg.set("35","4123456891023456D49121010000020100000");
    ...
    channel.send(msg);

Мой процесс получения получает F35 следующим образом:

Trk2#35=4123456891023457449121010000020100000

Итак, очевидно, что разделитель 'D' - это не число, а CHAR.

Я просмотрел доступные ISOFieldPackagers, но не могу найти ни одного класса, который обрабатывает разделители символов в числовых данных.

Единственное, что упоминается в моей спецификации, это

The Track 2 delimiter/separator character (^) must be encoded as X'D' (binary 1101).

Как я могу отправить разделитель символов для этого поля?

Любая помощь приветствуется!


person tytyty    schedule 18.09.2020    source источник


Ответы (1)


Спецификация неверна, знак вставки используется в качестве разделителя на дорожке 1, а не на 2. D - это разделитель дорожки 2, правильно обработанный jPOS с имеющейся у вас конфигурацией ISOFieldPackager.

person apr    schedule 19.09.2020
comment
Почему, когда я сдаю двойку, она меняется на 4 по аудиту? - person tytyty; 20.09.2020
comment
Так что это был правильный ответ. Я исправил свой вывод, изменив «D» в моей входной строке на «=», последний является фактическим разделителем, который не упоминается в моей спецификации. Почему он превращается в «D», я еще не нашел времени, чтобы узнать - person tytyty; 22.09.2020
comment
Спецификация Track2 сопоставляет разделитель = с шестнадцатеричной цифрой D, и jPOS позаботится об этом во время кодирования/декодирования. - person apr; 23.09.2020