如何处理 GenericPackager 中不同用途的字段?

How to handle fields with different usages in the 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

或者

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", "This is my data"),这似乎在大多数情况下都有效,但是当它到达我的获取过程。

感谢您的帮助,如果您需要更多信息,请告诉我

在通道级别,如果您有办法了解用法,可以使用 dynamic packager 支持。所以基本上,您创建不同的包,渠道决定在运行时使用哪一个。

但最简单的方法是将其作为不透明的二进制字段处理,然后在更高级别的代码上处理差异。

所以 apr 的答案是正确的。我花了比我愿意承认的更多的时间来理解它,但据我了解,你必须获取字符串的字节,然后 运行 通过你的解释器、前缀器等

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

然后在您的通用打包器中,它必须是(不透明的)二进制文件 class

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

二进制的原因是因为它的解释器在您像上述方法一样手动解释后不会再次更改您的字节。由于我对这个字段的每次使用都有 1 个字节的二进制长度,这就是为什么 class 我使用的是 IFB_LLH

只是想我会在这里添加这个,以供其他任何努力理解如何处理“不透明二进制字段”的人使用