问题描述
我有几个字段会根据使用该字段的用途来更改其定义。
例如,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
只是以为我会在这里添加它给其他想要了解如何处理“不透明二进制字段”的人