我有一个有趣的情况,我很难找到解决办法。
我的一个字段,对于tlv格式的visa字段34电子商务数据,它被定义为具有数据集id+2字节长度+tlv数据。所以本质上,它是一个嵌套的tlv字段。每个标签可以是不同的格式。
换句话说,它是tag+length+<tag+length+value>。
我已经阅读了org.jpos.tlv的github类,到目前为止,这是我的通用打包程序代码:
<isofieldpackager
id="34"
length="1024"
name="Electronic Commerce Data (TLV Format)"
pad="true"
class="org.jpos.iso.IFB_LLLLBINARY"
emitBitmap="false"
tagMapper="org.jpos.iso.packager.TTDecimalTagMapper"
packager="org.jpos.iso.packager.GenericTaggedFieldsPackager">
<isofield
id="56"
length="84"
name="TRACK 2 DATA"
pad="false"
class="com.visa.IFB_TTLLCHAR"/>
我的ifb\u ttllchar类:
public class IFB_TTLLCHAR extends ISOTagBinaryFieldPackager {
public IFB_TTLLCHAR() {
super(0,null, BcdPrefixer.LL, NullPadder.INSTANCE,
LiteralBinaryInterpreter.INSTANCE, BinaryPrefixer.BB);
}
以及我的java代码:
msg.setMTI("0100");
TLVList tl = new TLVList();
//Setting Tags 9F1F and DF1F, converting to decimal first for tag
tl.append(Integer.parseInt("9F1F",16), "F2F5F54BF2F5F54BF2F5F54BF2F5F5");
tl.append(Integer.parseInt("DF1F",16),"F7F6");
msg.set("34.56", tl.pack());
byte[] b = msg.pack();
System.out.println("Bytes read: " + b.length);
System.out.println("The bytes: " + Arrays.toString(b));
System.out.println(ISOUtil.hexdump(b));
msg.dump(System.out, "");
channel.send(msg);
对于像56这样的数字数据集id来说,这个包很好。我从收单机构的审计中得到了我期望的价值
Adtl-pos#34=5600179F1F0FF2F5F54BF2F5F54BF2F5F54BF2F5F5DF1F02F7F6
子字段id变成了数据集id(56),数据集id的长度以某种方式变成了bcd而不是二进制,但这可能是我的收单机构进程的逻辑。正确计算每个标记的长度。一切看起来都像我预期的结果。
但是有几个问题。我不能做字母数字数据集。将数据集从“56”更改为“4a”会导致以下错误:
Exception in thread "main" org.jpos.iso.ISOException: Error reading src/main/resources/visanet.xml
(org.xml.sax.SAXException: For input string: "4A"
java.lang.NumberFormatException: For input string: "4A")
我以为tagmapper或generictaggedfieldspackager可以处理字母数字标识?所以我不知道如何在xml通用打包程序中处理它。
显然,我觉得我处理得不对。
它也不能从我的另一个程序中正确地解压这个字段的所有字节,但我将把它保存下来,以供另一个问题使用
暂无答案!
目前还没有任何答案,快来回答吧!