如何在GenericPackager中处理具有不同用法的字段?

问题描述

我有几个字段会根据使用该字段的用途来更改其定义。

例如,F48定义为:

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

一次处理一种用法非常简单,例如,规范A和我的打包程序中定义了用法A:

Variable length,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”,“这是我的数据”),这似乎在大多数情况下都有效,但是当到达我的获取字段时,该字段将以一些不可读的数据为前缀过程。

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

解决方法

在渠道级别,如果有办法弄清楚用法,则可以使用dynamic packager支持。因此,基本上,您创建了不同的程序包,然后通道决定在运行时使用哪个程序包。

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

,

因此apr有正确的答案。我花了我不想承认的时间,但据我了解,您必须获取String的字节,然后通过您的解释器,前缀器等运行它。

import pyodbc
conn = pyodbc.connect('DSN=my-impala-dsn',autocommit=True) 
crsr = conn.cursor() 

crsr.execute("UPSERT INTO mydb.mytable (col1,col2,col3) values(?,?,?)",val1,val2,val3)

然后在您的通用打包程序中,它必须是(不透明的)二进制类

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

二进制的原因是因为在您像上述方法一样手动解释后,其解释器不会再次更改您的字节。由于此字段的每次使用都具有1字节的二进制长度,因此我使用的类是IFB_LLH

只是以为我会在这里添加它给其他想要了解如何处理“不透明二进制字段”的人