java8583报文解析及生成,粗略理解

粗略解释8583金融报文

注意:(此文章是以小白之眼来看的,如有资深人士发现错误欢迎指正交流)

8583协议是基于ISO8583报文国际标准的包格式的通讯协议,主要是用来解决金融系统之间的报文交换的,说白了就是信息数据的传递。一般使用的是64域报文,最长到128域。

首先明白8583报文细分来有6个部分:

长度

TPDU

报文头

消息类型

位图

数据(8583)

在说报文之前要了解两个东西

1)BCD码:二进码十进数,用4位二进制数来表示1位十进制数中的0~9这10个数码。

如:BCD码表示TPDU  6000160000  "60h,00h,16h,00h,00h"(5个字节).

ASCII码:ASCII大家一定都很了解,在报文中多次使用的ASCII码,现将数据对照ASCII码表转换成ASCII码,再转换成16进制数,就是最终数据。

如:ASCII码表示TPDU 6000160000 ASCII码表示6对应54,1对应49,0对应48 将其转换为16进制可表示为"36h,30h,30h,30h,31h,32h,30h,30h,30h,30h"(10个字节).

到此应该对这两种编码有所了解,在报文中两种码都有使用到

理解说明还是直接拿例子说事,更加明了

如例:

0080600016000060220000000002007020000020C0820019062051320000000261206000000000000200000000733706205132000000026120d191120100000000003030303031313131313032323530313533313131313131015600449f260892b6ae9a9b102ed69f2701809f101307010103a0a010010a010000001037513a22be

长度说明:长度指的是TPDU+报文头+消息类型+位图+数据的总长度。

如:0080 就表示这段报文的长度,是使用16进制数表示的0076(16进制)--123(10进制)---128个字符---256字节

TPDU说明:长度为10个字节,压缩时用BCD码表示为5个字节长度的数值。(每个银行,对应的TPDU值各不相同,接入银行时,相应的银行会提供相应值的)

如:6000160000

报文头说明:总长度为12字节,压缩时用BCD码表示为6个字节长度的数值。

如:60 22 0 0 000000

磁条卡金融支付类应用为:60
软件版本号             22
终端状态               0(正常交易状态)
处理要求               0(无处理要求)
保留使用               000000

消息类型说明:0200(只是截取了一部分便于理解,了解更多的话,去查查资料)

  0200/0210  金融类请求/应答报文     

            余额查询请求/应答    

            取现请求/应答     

            存款请求/应答 

            存款撤销请求/应答

位图说明:bit map域, 指示哪些域存在, 容易计算出, 位图是使用16进制数表示的,最终转为2进制,可以看出哪些域中存在数据。

70 20 00 00 20 C0 82 00

将位图转化为二进制为:

0111000000100000000000000000000000100000110000001000001000000000

第几位中存有数据则改为表示为1,使用64时第一位为0,当使用延长域是第一位表示为1也就是128

所以上面的位图中几个域存在:2, 3, 4, 11, 35, 41, 42, 49, 55.

数据说明:

<19 06 20 51 32 00 00 00 02 61 20>
field 2, 账号, n..19, LLVAR, 一字节表示长度(19), 账号是19, 前面补0, 10字节BCD表示.

2域是BCD表示的,所以实际存在2域中的数据是19位,但是在存储时是BCD码所以在末尾补0,截取的时候需要截取20位。

<60 00 00>
field 3, 处理码, n6, 定长, 3字节BCD表示 

<00 00 00 02 00 00>
field 4, 交易金额, n12, 定长, 6字节BCD表示, 这里的金额是200.00

<00 00 73>
field 11, 流水号, n6, 定长, 3字节BCD表示.流水号为"000073".

 <37 06 20 51 32 00 00 00 02 61 20 d1 91 12 01 00 00 00 00 00>
field 35, 二磁道数据, z..35, LLVAR, 一字节表示长度(37), 后面是19字节BCD表示的磁道数据

<30 30 30 30 31 31 31 31>
field 41, 终端号, ans8, 定长, ASCII表示, 这里终端号为"00001111"

 <31 30 32 32 35 30 31 35 33 31 31 31 31 31 31>
field 42, 商户号, ans15, 定长, ASCII表示, 这里商户号为"102250153111111"

<01 56>
field 49, 货币代码, n3, 定长, 前面补0后,用两字节BCD表示, 这里货币代码为"156"

<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>
field 55, 这是IC卡交易的相关数据, 最大长度是255, 这一域用的IC卡数据一般在PBOC/EMV规范里
都有自己的定义(包括格式), 所以,一般在报文里的格式跟它们在PBOC/EMV里定义的一致.一般是TLV(tag+lenght+value)表示一个数据.简单介绍一下数据的意义.


"00 44":长度, 表示44个字节
"9f 26 08 92 b6 ae 9a 9b 10 2e d6":应用密文(application cryptogram), TLV, b8
"9f 27 01 80":密文信息数据(cryptogram information data), TLV, b1

"9f 10 13 07 01 01 03 a0 a0 10 01 0a 01 00 00 00 10 37 51 3a 22 be":
发卡行应用数据(issuer application data), TLV, 变长,最大32字节. b..32.

最后想要说明:8583报文128域中的数据存储方式有四种分别是:1-int,2-binary 3-ASCII/*一个ascii码占两个偏移量 长度*2

当存储方式为ASCII时,数据的长度需要*2,当为变长域时,存储的长度也是长度的1/2,这是针对组成代码来说的。

目前我的理解就这么多,通俗易懂的写出来。

如有不明白或者需要解析合成代码的私聊我。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值