java-解析iso8583消息时出现问题

java-解析iso8583消息时出现问题,第1张

概述我已经从这里https://github.com/vikrantlabde/iso8583-Java下载了代码,经过一些修改后,我几乎解析了我的所有字段….我定义了这样的架构:ISOSCHEMA.put("1","BITMAP");ISOSCHEMA.put("2","NUM-2-19-0_0");ISOSCHEMA.put("3","NUMERIC-0-6-0_0");I

我已经从这里https://github.com/vikrantlabde/iso8583-Java下载了代码,经过一些修改后,我几乎解析了我的所有字段….
我定义了这样的架构:

ISOSCHEMA.put("1","BITMAP");ISOSCHEMA.put("2","NUM-2-19-0_0");ISOSCHEMA.put("3","NUMERIC-0-6-0_0");ISOSCHEMA.put("4","NUMERIC-0-12-0_0");ISOSCHEMA.put("7","NUMERIC-0-10-0_0");ISOSCHEMA.put("11","NUMERIC-0-6-0_0");ISOSCHEMA.put("12","NUMERIC-0-6-0_0");ISOSCHEMA.put("13","NUMERIC-0-4-0_0");ISOSCHEMA.put("22","NUMERIC-0-3-0_0");ISOSCHEMA.put("23","NUMERIC-0-3-0_0");ISOSCHEMA.put("35","NUM-2-37-0_0");ISOSCHEMA.put("41","FCHAR-0-8-0_0");ISOSCHEMA.put("49","FCHAR-0-3-0_0");ISOSCHEMA.put("55","NUM-3-999-0_0");

问题是字段55是二进制字段.标准文档说:

55保留ISO B 255 LLLVAR(ISO文件)

我在解析一个字符串的错误,该字符串的字段55的位图已打开.

我从输出中得到:
820200409F36020004950500000000009A031409039C01005F2A0209789F02

ISOSCHEMA.put("1","BITMAP");ISOSCHEMA.put("2","NUM-2-19-0_0");ISOSCHEMA.put("3","NUMERIC-0-6-0_0");ISOSCHEMA.put("4","NUMERIC-0-12-0_0");ISOSCHEMA.put("7","NUMERIC-0-10-0_0");ISOSCHEMA.put("11","NUMERIC-0-6-0_0");ISOSCHEMA.put("12","NUMERIC-0-6-0_0");ISOSCHEMA.put("13","NUMERIC-0-4-0_0");ISOSCHEMA.put("22","NUMERIC-0-3-0_0");ISOSCHEMA.put("23","NUMERIC-0-3-0_0");ISOSCHEMA.put("35","NUM-2-37-0_0");ISOSCHEMA.put("41","FCHAR-0-8-0_0");ISOSCHEMA.put("49","FCHAR-0-3-0_0");ISOSCHEMA.put("55","NUM-3-999-0_0");

0000005009F03

ISOSCHEMA.put("1","BITMAP");ISOSCHEMA.put("2","NUM-2-19-0_0");ISOSCHEMA.put("3","NUMERIC-0-6-0_0");ISOSCHEMA.put("4","NUMERIC-0-12-0_0");ISOSCHEMA.put("7","NUMERIC-0-10-0_0");ISOSCHEMA.put("11","NUMERIC-0-6-0_0");ISOSCHEMA.put("12","NUMERIC-0-6-0_0");ISOSCHEMA.put("13","NUMERIC-0-4-0_0");ISOSCHEMA.put("22","NUMERIC-0-3-0_0");ISOSCHEMA.put("23","NUMERIC-0-3-0_0");ISOSCHEMA.put("35","NUM-2-37-0_0");ISOSCHEMA.put("41","FCHAR-0-8-0_0");ISOSCHEMA.put("49","FCHAR-0-3-0_0");ISOSCHEMA.put("55","NUM-3-999-0_0");

0000000009F10201F430200200000000000000000045895000000000000000000000000000000000000009F260840D26C4BA5577CFB9F2701809F370443DD7E879F1A0202509F3303E0B0C8

但我期望:
820200409F36020004950500000000009A031409039C01005F2A0201249F02

ISOSCHEMA.put("1","BITMAP");ISOSCHEMA.put("2","NUM-2-19-0_0");ISOSCHEMA.put("3","NUMERIC-0-6-0_0");ISOSCHEMA.put("4","NUMERIC-0-12-0_0");ISOSCHEMA.put("7","NUMERIC-0-10-0_0");ISOSCHEMA.put("11","NUMERIC-0-6-0_0");ISOSCHEMA.put("12","NUMERIC-0-6-0_0");ISOSCHEMA.put("13","NUMERIC-0-4-0_0");ISOSCHEMA.put("22","NUMERIC-0-3-0_0");ISOSCHEMA.put("23","NUMERIC-0-3-0_0");ISOSCHEMA.put("35","NUM-2-37-0_0");ISOSCHEMA.put("41","FCHAR-0-8-0_0");ISOSCHEMA.put("49","FCHAR-0-3-0_0");ISOSCHEMA.put("55","NUM-3-999-0_0");

0000005009F03

ISOSCHEMA.put("1","BITMAP");ISOSCHEMA.put("2","NUM-2-19-0_0");ISOSCHEMA.put("3","NUMERIC-0-6-0_0");ISOSCHEMA.put("4","NUMERIC-0-12-0_0");ISOSCHEMA.put("7","NUMERIC-0-10-0_0");ISOSCHEMA.put("11","NUMERIC-0-6-0_0");ISOSCHEMA.put("12","NUMERIC-0-6-0_0");ISOSCHEMA.put("13","NUMERIC-0-4-0_0");ISOSCHEMA.put("22","NUMERIC-0-3-0_0");ISOSCHEMA.put("23","NUMERIC-0-3-0_0");ISOSCHEMA.put("35","NUM-2-37-0_0");ISOSCHEMA.put("41","FCHAR-0-8-0_0");ISOSCHEMA.put("49","FCHAR-0-3-0_0");ISOSCHEMA.put("55","NUM-3-999-0_0");

0000000009F10201F430200200000000000000000045895000000000000000000000000000000000000009009260260D2C5BA

转换后的iso有效负载的长度也大不相同…

程序输出为:
303130307238

unpackIsoMsg(new String(ISOUtil.hex2byte(isoMessage), "UTF-8"));

0C280C28200313636353433323131313232333334343535303030303030303030303030303030303031313031363138333432363030323339343133333433303130313630373130303133373635343332313131323233333434353564333131303232303030393238333030313031303238343031373430393132343233303832303230303430394633363032303030343935303530303030303030303030394130333134303930333943303130303546324130323039373839463032303630303030303030303035303039463033303630303030303030303030303039463130323031463433303230303230303030303030303030303030303030303034353839353030303030303030303030303030303030303030303030303030303030303030394632363038343044323643344241353537374346423946323730313830394633373034343344443745383739463141303230323530394633333033453042304338

我期望的是:
303130307238

unpackIsoMsg(new String(ISOUtil.hex2byte(isoMessage), "UTF-8"));

080820031363635343332313131323233333434353530303030303030303030303030303030303131303136313833343236303032333934313333343330313031363037313030313337363534333231313132323333343435353D33313130323230303039323833303031303130323834303137343039313234313135820200409F36020004950500000000009A031409039C01005F2A0201249F02

ISOSCHEMA.put("1","BITMAP");ISOSCHEMA.put("2","NUM-2-19-0_0");ISOSCHEMA.put("3","NUMERIC-0-6-0_0");ISOSCHEMA.put("4","NUMERIC-0-12-0_0");ISOSCHEMA.put("7","NUMERIC-0-10-0_0");ISOSCHEMA.put("11","NUMERIC-0-6-0_0");ISOSCHEMA.put("12","NUMERIC-0-6-0_0");ISOSCHEMA.put("13","NUMERIC-0-4-0_0");ISOSCHEMA.put("22","NUMERIC-0-3-0_0");ISOSCHEMA.put("23","NUMERIC-0-3-0_0");ISOSCHEMA.put("35","NUM-2-37-0_0");ISOSCHEMA.put("41","FCHAR-0-8-0_0");ISOSCHEMA.put("49","FCHAR-0-3-0_0");ISOSCHEMA.put("55","NUM-3-999-0_0");

0000005009F03

ISOSCHEMA.put("1","BITMAP");ISOSCHEMA.put("2","NUM-2-19-0_0");ISOSCHEMA.put("3","NUMERIC-0-6-0_0");ISOSCHEMA.put("4","NUMERIC-0-12-0_0");ISOSCHEMA.put("7","NUMERIC-0-10-0_0");ISOSCHEMA.put("11","NUMERIC-0-6-0_0");ISOSCHEMA.put("12","NUMERIC-0-6-0_0");ISOSCHEMA.put("13","NUMERIC-0-4-0_0");ISOSCHEMA.put("22","NUMERIC-0-3-0_0");ISOSCHEMA.put("23","NUMERIC-0-3-0_0");ISOSCHEMA.put("35","NUM-2-37-0_0");ISOSCHEMA.put("41","FCHAR-0-8-0_0");ISOSCHEMA.put("49","FCHAR-0-3-0_0");ISOSCHEMA.put("55","NUM-3-999-0_0");

0000000009F10201F430200200000000000000000045895000000000000000000000000000000009F260840D26C4BA5577CFB9F2701809F370443DD7E879F1A0202509F3303E0B0C8

一种建议是:
我必须从结果byte []进行显式转换为十六进制,反之亦然.
它是:

String isoMessage = ISOUtil.hexString(packIsoMsg("0100", isofIElds).getBytes());

和:

unpackIsoMsg(new String(ISOUtil.hex2byte(isoMessage), "UTF-8"));

此类中此类字段的定义呢?我真的是使用该标准的新手,但是我来到这里是因为jpos在AndroID环境中不起作用.另外,我对最后提到的十六进制转换感到困惑.

任何帮助都非常感激…
亲切的问候.

解决方法:

DE55定义为“标记滞后值”(TLV)字段,该字段不是标准的二进制/文本/或数字打包格式,您通常会看到其余的ISO-8583消息,但格式为ASN.1 BER-TLV/X.690-0207.

除非您负责BER-TLV,否则除非它用于非EMV /令牌化目的,否则您将无法成功解包DE55.起初让我感到震惊,同时我也在想一些更直接的事情.请注意,有时这种格式的字段传输格式实际上比原始纯文本或其他二进制数据输出的格式更长,因此它不是最有效的.

根据ISO规范,还有其他几个字段也可以使用BER-TLV,但DE55是将BER-TLV用于EMV功能的行业标准字段,它代替了DE55以前作为通用且很少使用的“费用字段”.

ISO-7816规范及其ISO-8583详细用于EMV和令牌化,此外,如果您只是在寻找不那么深入的内容,还有其他参考和quick guides.所有ISO-7816规范的卷都可以在互联网上免费找到,或者如果您希望使用纯ISO格式,可以从ISO organization直接购买(spendy).

我不熟悉您所引用的特定JAVA Git,但是this one提供了有关如何使用BER-TLV的帮助页面. Oracle也提供有关BER-TLV here的页面.BinaryFoo也提供Git.

为了进行初始测试,如果您的数据仅是测试数据(请勿使用生产数据!),则可以使用http://www.emvlab.org/tlvutils/来验证结果.当我输入您的输入时,它将踢出您的预期输出.

总结

以上是内存溢出为你收集整理的java-解析iso8583消息时出现问题全部内容,希望文章能够帮你解决java-解析iso8583消息时出现问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1079038.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存