Python 3.x 如何使用非十六进制字符处理ISO8583位图

Python 3.x 如何使用非十六进制字符处理ISO8583位图,python-3.x,bitmap,iso8583,Python 3.x,Bitmap,Iso8583,我试图使用py8583包在Python3中正确解析ISO8583(1987)消息。在遇到解析器的一些问题后,我意识到ISO8583消息中的位图似乎格式不正确 这是有问题的ISO8583位图: P8P12116616684989 这是完整的ISO8583信息。它使用垃圾测试数据,所以不需要担心敏感信息。 NP0100P8P121166684989300000000000000200414104019041104009904SHDPF406C431出纳_010130101000200491665D9

我试图使用py8583包在Python3中正确解析ISO8583(1987)消息。在遇到解析器的一些问题后,我意识到ISO8583消息中的位图似乎格式不正确

这是有问题的ISO8583位图:
P8P12116616684989

这是完整的ISO8583信息。它使用垃圾测试数据,所以不需要担心敏感信息。
NP0100P8P121166684989300000000000000200414104019041104009904SHDPF406C431出纳_010130101000200491665D9832B92FD380C

据我所知,位图应该只包含1-9/A-F十六进制字符,但正如您所看到的,它以“P8P12…”开头

这里有我遗漏的东西吗?这些ISO8583消息目前正在企业级公司中使用。此外,当一些在线解析器抛出位图错误时,我发现其中一个似乎解析得很好(下面的链接)。我搞不懂它是怎么解析的

(编辑:正确地指出,该网站不允许您键入非十六进制字符,只允许复制/粘贴它们,因此它可能不再与该问题相关。)

十六进制转储如下:

0010   08 00 45 00 00 ab 03 b1 00 00 3c 06 fa 89 c0 a8
0020   15 02 40 87 69 e1 81 1c 0b bb b7 b9 78 55 c7 86
0030   4a 2c 50 18 12 24 2f d3 00 00 4e 50 00 00 00 7d
0040   30 31 30 30 50 38 00 01 80 c0 00 50 31 32 31 31
0050   36 36 31 36 38 34 39 38 39 33 30 30 30 30 30 30
0060   30 30 30 30 30 30 30 32 30 30 34 38 31 34 30 39
0070   35 39 31 39 30 34 31 31 30 34 30 30 39 39 30 34
0080   53 48 44 50 66 34 30 36 63 34 33 31 43 61 73 68
0090   69 65 72 5f 30 31 20 20 20 20 20 30 31 33 30 31
00a0   30 30 31 30 30 30 32 30 30 34 38 31 36 36 35 44
00b0   39 38 33 32 42 39 32 46 44 33 38 30 43
任何来自ISO8583专家的帮助都将不胜感激

似乎有点不对劲


从十六进制转储看起来像某种0800网络消息。这将使位图以0x45开始。这将是0100 0101的二进制位图,表示存在位2、6和8。ISO 8583第2位始终是PAN(卡号),因此这没有多大意义。Bit的6和8在网络消息的上下文中似乎没有意义,因为前者是持卡人账单金额,后者是持卡人金额费用

您确定
p8p12116616684989
是位图,而不是数据字段吗?你会发现网站不允许输入非十六进制字符(即使你可以复制和粘贴它们)。我将把整个ISO8583信息添加到帖子中(都是测试数据,所以没有透露任何敏感信息。)从我收集到的信息来看,“NP”是标题,后面的4位数字是MTI,后面应该是位图。它看起来不是有效的ISO8583信息。当以ASCII字符串形式发布消息时,可能会丢失一些不可打印的字节。请提供此示例消息的十六进制转储。添加了十六进制转储,我最初使用Wireshark尝试读取它。Wikipedia给出了以下神秘的注释:“位图可以表示为8字节的二进制数据或ASCII或EBCDIC字符集中的16个十六进制字符(0-9,A-F)。”