Как обрабатывать поля с различным использованием в GenericPackager?

У меня есть несколько полей, которые меняют свои определения в зависимости от того, какое использование этого поля используется.

Например, F48 определяется как:

Variable Length, 1-byte binary + 255 bytes, variable by usage, max 256 bytes

Достаточно просто обрабатывать одно использование за раз, например, использование A определено в спецификации и моем упаковщике:

Variable length, 1-byte binary + 255 bytes, EBCDIC, max 256 bytes
<isofield
  id="48"
  length="255"
  name="ADITIONAL DATA - PRIVATE"
  class="org.jpos.iso.IFB_LLHECHAR"/>

Но другое использование может быть определено как

variable length, 1-byte binary + 4 N, 4-bit BCD

Or

variable length, 1-byte binary + 143 AN, EBCDIC

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

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

Например, с использованием A я попытался

<isofieldpackager
      id="48"
      length="255"
      name="F48 ADDITIONAL DATA - PRIVATE"
      emitBitmap="false"
      firstField="0"
      class="org.jpos.iso.IFB_LLHBINARY"
      packager="org.jpos.iso.packager.GenericSubFieldPackager">
<isofield
        id="0"
        length="255"
        name="ADITIONAL DATA - PRIVATE"
        class="org.jpos.iso.IFB_LLHECHAR"/>
</isofieldpackager>

а затем установить поле как isoMSG.set(48.0, это мои данные), что, кажется, работает по большей части, но есть некоторые нечитаемые данные, которые добавляются к этому полю, когда они достигают моего процесса получения.

Спасибо за любую помощь, если вам нужна дополнительная информация, дайте мне знать


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


Ответы (2)


На уровне канала, если у вас есть способ выяснить использование, вы можете использовать поддержку dynamic packager. Таким образом, вы создаете разные пакеты, и канал решает, какой из них использовать во время выполнения.

Но проще всего обрабатывать его как непрозрачное двоичное поле, а затем обрабатывать различия в коде более высокого уровня.

person apr    schedule 24.09.2020
comment
Спасибо за ответ. Могу я спросить, что такое непрозрачное двоичное поле? Кроме того, можно ли увидеть пример обработки различных вариантов использования в коде более высокого уровня? - person tytyty; 25.09.2020
comment
NVM, кажется, я понял это. Опубликовал ответ, а также с тем, что я сделал. Надеюсь, мое понимание правильное - person tytyty; 28.09.2020

Итак, у apr есть правильный ответ. Мне потребовалось больше времени, чем я хотел бы признать, чтобы понять это, но насколько я понимаю, вам нужно взять байты строки, а затем запустить их через свой интерпретатор, префикс и т. д.

private static byte[] calcBytes(String s) throws ISOException {
    byte[] bytes = s.getBytes();
    EbcdicInterpreter.INSTANCE.interpret(s,bytes,0);
    return bytes;

Затем в вашем универсальном упаковщике это должен быть (непрозрачный) двоичный класс.

<isofield
  id="48"
  length="255"
  name="ADITIONAL DATA - PRIVATE"
  class="org.jpos.iso.IFB_LLHBINARY"/>

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

Просто подумал, что добавлю это сюда для всех, кто пытается понять, что делать с непрозрачным двоичным полем.

person tytyty    schedule 28.09.2020