ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。 8583包前面一段为位图,用来确定包的字段域组成情况。其中位图是8583包的灵魂,它是打包解包确定字段域的关键,而了解每个字段域的属性则是填写数据的基础。
位图描述如下:
位图位置:1
格式:定长
类型:B16(二进制16位,16*8=128bit)
描述:如将位图的第一位设为‘1‘,表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。如使用某数据域,应在位图中将相应的位设位‘1‘,如使用41域,需将位图的41位设为‘1‘。
从第二域开始则为数据包的数据域,数据域不一定是每一个域都有值,数据域是否有值是由位图域来决定的。以银联的消费交易为例,下面来解析一段报文:60001300006022000000000200302004C030C198011900000000000049251631180210001237622848299836XXXXXXXD23122209656980000F010499622848299836XXXXXXXD156156000000000000000000000021414142312DD000000000000D000000000000D0023813000000003635393030333139383938363539303438313430303033010350414333313330303030303030303020202020202020202031313030303031333030303030303030302020202020202020203130313030383035343031303631343130323731363331313832353133353935202020202020202020202020202020202020202023313536FD7FCC695E6083DC2000000000000000333A84758CBA943C
解析后的结果为:
TPDU= 【6000130000】
MSGHEAD= 【602200000000】
报文类型 = 【0200】
F000.位图 =【016】【302004C030C19801】
F003.交易处理码 =【006】【190000】
F004.交易金额 =【012】【000000004925】
F011.系统跟踪号 =【006】【163118】
F022.服务点输入方式码 =【003】【021】
F025.服务点条件码 =【002】【00】
F026.服务点PIN获取码 =【002】【12】
F035.第二磁道数据 =【037】【622848299836XXXXXXXD23122209656980000】
F036.第三磁道数据 =【104】【99622848299836XXXXXXXD156156000000000000000000000021414142312DD000000000000D000000000000D002381300000000】
F041.受卡机终端标识码 =【008】【65900319】
F042.受卡方标识码 =【015】【898659048140003】
F048.附加数据-私有 =【103】【PAC313000000000 11000013000000000 10100805401061410271631182513595 #】
F049.交易货币代码 =【003】【156】
F052.个人标识码数据 =【016】【FD7FCC695E6083DC】
F053.安全控制信息 =【016】【2000000000000000】
F064.MAC = 【008】【333A84758CBA943C】
具体的解析步骤如下:TPDU为固定5个字节的长度,MSGHEAD为固定6个字节长度,接下来的两个字节为消息类型,0200代表消费请求交易。接下来的8个字节代表位图域,位图域的最高字节为0则代表该报文只用的了8583协议的前64个域,解析完8个字节的位图域302004C030C19801则能分析出3,4,11,22,25,26,35,36,41,42,48,49,52,53,64域是有值的。
第3域解析:第三域为属性为数字类型长度为6且组包类型为BCD压缩方式,故可以直接数6位即可,这样就解析出第三域的内容为190000;
第4域解析:第4域和第三域一样,唯一不同的是长度为12,故数12位,解析出来的内容为000000004925,注意此处的单位为分。
第11域解析:第11域与第3域完全一样,故数6位即可,解析出来的内容为163118。
第22域解析:第22域属性为数字,长度为3,组包类型为BCD压缩方式,注意此处因为是BCD压缩的方式,故不能直接数3位了,此处要数4位,且去掉最后一位补的0,故解析出来的结果为021
第25域解析:第25域和第三域一样,唯一不同的是长度为2,故数两位即可,解析出来的结果为00
第26域解析:第26域和第25域完全一样,故数两位即可,解析出来的结果为12
第35域解析:第35域为两位变长,分长度域和数据域,先分析长度域,长度域为2且组包类型为BCD码压缩方式,故数两位长度,长度值为37,根据长度域来解析该域的数据域,数据域的组包类型为BCD码压缩方式,故需要数48位,并去掉最后面在组包的时候补的F,故解析出来的结果为622848299836XXXXXXXD23122209656980000。
第36域解析:第36域为三位变长,分长度域和数据域,同样先分析长度域,长度域为3且组包类型为BCD码压缩方式,故数四位长度,长度值为0104,去掉最左侧在组包的时候补的0,故解析出来的长度域为104,根据长度域解析数据域,因为数据域的组包方式为BCD码压缩方式,故数104位即可,解析出来的结果为99622848299836XXXXXXXD156156000000000000000000000021414142312DD000000000000D000000000000D002381300000000。
第41域解析:第41域属性为字母数字特殊符号的组合,长度为8,组包方式为ASCII方式,故此处要数16位,此处数出值为3635393030333139,将ASCII转换为数字、字母、特殊字符后就变成解析结果,故此域的解析结果为65900319
第42域解析:第42域与第41域相同,只是长度为15,故此处要数30位,解析的结果为898659048140003。
第48域解析:第48域为3位变长,故分数据域和长度域,长度域的解析跟36域的长度域解析方式一样,长度域解析结果为103,数据域的编码方式为ASCII,故此处要数206位,此处数出值为50414333313330303030303030303020202020202020202031313030303031333030303030303030302020202020202020203130313030383035343031303631343130323731363331313832353133353935202020202020202020202020202020202020202023,将此处的ASCII码转换为数字、字符、字母后的结果为PAC313000000000 11000013000000000 10100805401061410271631182513595 #。
第49域解析:第49域跟第41域一样,不同的是此域的长度为3,故此处数6位,数出来的数据为313536,将ASCII转换为数字后,此域的解析结果为156
第52域解析:第52域属性为二进制数据,长度为64,组包方式为二进制,所以此处数8位,解析出来的结果为FD7FCC695E6083DC
第53域解析:第53域与第3域相同,长度为16,故数16位即可,所以此处解析出来的结果为2000000000000000
第64域解析:第64域与第52域完全一样,故解析出来的结果为333A84758CBA943C
至此该数据包解析完成,特别说明一下,此数据是从生产环境的日志中取的报文,其中包含用户银行卡的二三磁道数据等敏感信息,故此处对报文进行了处理,该处理是将卡号后七位影藏为XXXXXXX,也就是上面红色的XXXXXXX部分,但此处的处理不影响此处对报文解析的理解。原文地址:http://blog.csdn.net/kxd_ysheng/article/details/40512551