(上图由前同事提供)
我们来结合一个实例,来讲解一下ISO-8583协议。
看到这一堆数据,确实让人感到心烦意乱。莫心急,我们一步一步来。
上面的数据不妨看作一个大小为N的字节数组,记为b[N],则数据的内容为b[0],b[1],……,b[N-1]。就本例而言,N为111。它们的意义如下:
【02】b[0],固定的起始字节。
【01 06】b[1],b[2],长度(后述)。
【60 00 07 08 08】b[3]到b[7],TPDU。
【20 00】b[8],b[9],消息类型。
【30 20 05 00 20 C0 02 01】b[10]到b[17],BITMAP。
【00 40 00 …… 30 30 31】b[18]到b[N-3],各个域的内容。
【03】b[N-2],校验值。
【22】b[N-1],结束字节。
事实上,从b[3]到b[N-3]才是真正的ISO-8583协议的数据,但我们在编写程序的时候却要在前后分别添加3字节和2字节。加上去的内容表明了起、止的标识,并附加了校验值和长度。这里的长度指的是ISO-8583数据本身的长度,显然,它等于N-5。本例中,长度为106字节。用BCD码表示即为0x01 0x06。
TPDU是表示地址用的。它有10字节,BCD压缩之后有5字节。第一个字节一般是0x60,第二、三字节是目标地址,剩下的两个字节是源地址。
消息类型表示这个报文所做的是什么交易。比如,余额查询为0200,消费冲正为0400。
接下来的8个字节或16个字节为位元表(BITMAP)。我们知道,交易数据有128个域,而16个字节有128个位,于是,便可以用这128个位来分别表示交易数据中存在哪些域(1存在,0不存在)。在很多情况下,65域到128域是不存在的,此时,8个字节(64个域)便够用了。那么,怎么区分位元表的大小是8字节还是16字节呢?看位元表的第一个位。如果该位为1,则位元表大小为16,否则为8。
接下来便是交易的数据了。其中有若干的域。域有定长、变长。定长的域,直接放数据,变长的域,先有一个字节或两个字节来表示域的长度,然后放数据。(详见协议)
当然,各个域还有编码问题,有的BCD,有的ASCII。一个域采用什么编码,有协议规定。
最后就是校验值和结束符了。
校验值不同的银行有不同的规定,有的要求求和校验,有的要求CRC,不一而足。