BCD码: 一个字节转化为 2个BCD码,报文使用16进制展示二进制数,显然,一个字节可以转化为2个16进制的数字 1111 1111→FF ,这里F就是一个BCD码,一个字节转化为2个BCD码
N…x 代表数字类型 x代表位数 …代表变长,若x为技术,则自动补0,凑足一个bcd码
N4:4位定长数字
N6:6位定长数字
N…6:6位变长数字
AN…x AN代表数字或字母,用ANSCII码解析,;x代表位数; …代表变长
AN4:4位定长数字或字符
AN6:6位定长数字或字符
AN…6:6位变长数字或字符
ANS 代表数字、字母或特殊字符,用ANSCII码解析
ANS4:4位定长数字或字符、特殊字符
ANS6:6位定长数字或字符、特殊字符
ANS…6:6位变长数字或字符、特殊字符
域的概念:每一个域的功能是约定好规则的,有一些是定长,有一些是变长,用户记载特定的信息
8583报文的例子:
02 00
70 20 00 00 20 C0 82 00
19 06 20 51 32 00 00 00 02 61 20 60 00 00 00 00 00 02 00 00 00 00 73 37 06 20 51 32 00 00 00 02 61 20 d1 91 12 01 00 00 00 00 00 30 30 30 30 31 31 31 31 31 30 32 32 35 30 31 35 33 31 31 31 31 31 31 01 56 00 44 9f 26 08 92 b6 ae 9a 9b 10 2e d6 9f 27 01 80 9f 10 13 07 01 01 03 a0 a0 10 01 0a 01 00 00 00 10 37 51 3a 22 be
第一行,信息类型(MTI),2个字节,4个BCD码,表示 ,一般在处理报文时可以忽略这两个字节
第二行,位图域,8个字节,16个BCD码,二进制展示时第一位如果为0,域总长度为64,如果第一位为1,则总长度为128,从第2位起,当值为1时,表示该域启动,
比如 0111000000100000000000000000000000100000110000001000000000000000 能够看出2、3、4、11、 35、 41、 42、 49这些位置是1.则表示在8583报文中,的2、3、4、11、 35、 41、 42、 49域是传输了数据的。
第三行,后面N个数字表示报文数据
https://www.cnblogs.com/fenglan/p/6088690.html
这篇博客生动形象的解释了8583报文,首先推荐给之前一点都不了解8583报文的同学。
然后参照了下面博客,尝试自己理解
https://blog.csdn.net/cbacq/article/details/51495593
若阅读了以上篇博客,还有不懂的,再来看看本文,看能否有一些收获。
若还有不懂的,则需要你来补充了。
02 00 70 20 00 00 20 C0 82 00 19 06 20 51 32 00 00 00 02 61 20 60 00 00 00 00 00 02 00 00 00 00 73 37 06 20 51 32 00 00 00 02 61 20 d1 91 12 01 00 00 00 00 00 30 30 30 30 31 31 31 31 31 30 32 32 35 30 31 35 33 31 31 31 31 31 31 01 56 00 44 9f 26 08 92 b6 ae 9a 9b 10 2e d6 9f 27 01 80 9f 10 13 07 01 01 03 a0 a0 10 01 0a 01 00 00 00 10 37 51 3a 22 be
8583报文=信息类型域+位图域+报文数据域
前面10个字节的BCD码(也就是20个BCD码,亦是20个数字)表示报头,在上面报文中报头是<02 00 70 20 00 00 20 C0 82 00>
其中前面四个数字表示 信息类型(MTI),上面报文的信息类型是<02 00>
后面的16个BCD码为 位图域。上面报文的信息类型是<70 20 00 00 20 C0 82 00>
后面N个数字表示报文数据
其中每位数字都有他的含义。不做翻译
第一位:8583 version number
第二位:message class
第三位:message sub-class
第四位:transaction originator
开头不为1,则表示64位的位图。
将上面的位图转换成二进制,为:
111000000100000000000000000000000100000110000001000000000000000
不足64位,前面补0,为:
0111000000100000000000000000000000100000110000001000000000000000
现在看是数了,能够看出2、3、4、11、 35、 41、 42、 49这些位置是1.则表示在8583报文中,的2、3、4、11、 35、 41、 42、 49域是传输了数据的。
在解读数据域之前,你应该先了解报文的数据类型和代表符
位:二进制中,一个0或1,表示位
Bcd码:四个位表示一个bcd码(可以理解成八进制数中1位)
字节:八个位表示个字节(可以理解成十六进制数中1位)
N…x 代表数字类型 x代表位数 …代表变长,若x为技术,则自动补0,凑足一个bcd码
N4:4位定长数字
N6:6位定长数字
N…6:6位变长数字
AN…x AN代表数字或字母,用ANSCII码解析,;x代表位数; …代表变长
AN4:4位定长数字或字符
AN6:6位定长数字或字符
AN…6:6位变长数字或字符
ANS 代表数字、字母或特殊字符,用ANSCII码解析
ANS4:4位定长数字或字符、特殊字符
ANS6:6位定长数字或字符、特殊字符
ANS…6:6位变长数字或字符、特殊字符
此时我们需要找一份8583报文的域列表来对照着解读了。
可以参照百度百科:
https://baike.baidu.com/item/8583%E5%8D%8F%E8%AE%AE/5754381?fr=aladdin#4
https://baike.baidu.com/item/8583协议/5754381?fr=aladdin#5
接下来我们分别找到百度百科里,2、3、4、11、 35、 41、 42、 49的说明。
举个例,11域
百度百科里域的说明:
Bit11系统跟踪号(Systems Trace Audit Number)
位图位置:11
格式:定长
类型:N6
结合我们的报文<00 50 18>
field 11, 流水号, n6, 定长, 用6个BCD码(即3字节的BCD码)表示, 流水号为“005018”。
举个例,42域
百度百科里域的说明:
域42 受卡方标识码
变量属性
ans15,15位定长的字母、数字和特殊字符
域描述:受卡方的标识码,即商户代码。
结合我们的报文<30 31 31 30 30 30 30 30 31 30 30 30 30 30 31>
field 42, 商户号,ans15, 定长, ASCII码表示;这里的商户号为:“011000001000001”
这里30用ascii码解读就是0;31用ascii码解读就是1;(自己找一张ascii码对照表解读)
百度百科里域的说明:
Bit35二磁道数据(Track 2 Data)
位图位置:35
格式:LLVAR
类型:Z…37
结合我们的报文 <37 76 89 20 00 10 17 26 45 67 3d 13 08 20 14 78 00 00 00 00>
field 35, 二磁道数据, z…37(LLVAR), 第一个字节表示域的长度(37)。35域是个自定义域。
z…37(LLVAR) 表示37变长字符. llvar表示用几位数字来表示后面数据的长度。一个L表示以为数此处有两个L,表示有该域的前两位用来表示数据的长度。若有三个L 则应该前面补0,用四位数表示数据的长度,若有四个L,自然也是用四位数字表示数据长度
如z…130(LLLVAR) <01 30 31 31 30 30 30 30 30 31 30 30 30 30 30 31 … …>,则前面四位0130表示数据长度,后面有130位表示数据内容
————————————————
版权声明:本文为CSDN博主「松子落」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28898309/article/details/82890770