简单iso8583报文组装与解析 概念篇

        ISO8583报文(简称8583包)又称8583报文是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。其实就是把要传的金额啊、时间呀、以及其它一些信息放入这128域里面。首先我们来看看什么是定长和边长,定长就是固定长度,比如第6域要传金额,定长是12,用N12标识,那么1元钱等于000000001000,也就是必须凑够12位,里面涉及左靠还是右靠的问题,无非就是在左边补齐0或者在右边补齐0而已。如果是变长,那么就得在实际数据前面加上该域的长度,比如32域,LLVAR n..11(不超过11位的数字)。假设是货币类型,我们用156表示人民币,那么实际传的时候就是3156 ,这就是变长。简单来讲定长就是协议自定义的默认长度,不够一般补齐长度;变长就是得在实际数据前面加上长度。下面是一些代表某个位的简称字符,有助于帮助理解每个域的长度以及可以填的字符或者数字等情况。

—— M 强制域(Mandatory),此域在该消息中必须出现否则将被认为消息格式出错。
—— C 条件域(Conditional),此域在一定条件下出现在该消息中。
—— O 选用域(Optional),此域在该消息中由发送方自选。
—— Space 此域在该种消息中不出现。
—— A 字母a-z
—— n 数字0-9
—— s 特殊字符
—— an 字母和数字字符
—— ans 字母、数字和特殊字符
—— MM 月
—— DD 日
—— YY 年
—— hh 小时
—— mm 分
—— ss 秒
—— LL 允许的最大长度为99
—— LLL 允许的最大长度为999
—— VAR 可变长度域
—— b 数据的二进制表示,后跟数字表示位(bit)的个数
—— B 用于表示变长的二进制数,后跟数字表示二进制数据所占字节(Byte)的个数
—— z 按GB/T 15120和GB/T 17552的2、3磁道编码
—— cn BCD压缩编码数值

比如:

P-6

amount

C

n12

那么就是6域必填,定长12的数字了,有点啰嗦了。

我们再来看8583报文都是由哪些部分组成的,按我自己理解是iso=报文长度(4个字节,可以根据协议自己定)+报文头(可以是TPDU+消息标识等等,一般4个字节,如果加上TPDU那么10个字节以上了)+位图(8字节,如果是128域表示,这个域占16字节)+实际数据data,一般数据都采用16进制表示法。为了方便举例我们暂时只用4个字节的消息标识表示报文头。

报文长度,这个一般是等后面除长度部分拼好以后计算出来的,这个长度也就是报文头+位图+ 实际数据的长度,在这里就是4+8(16)+data.length()/2。注意,如果是16进制表示,那么就是两个字节表示一位,后面我们详细举例。假设我们计算长度是42,那么4个字节是0042,16进制表示法是30 30 34 32。报文头部分,一般来讲都是固定部分,假设是只用4个字节表示消息类型,比如用1000表示交易类型的报文,1200表示退款类型的报文等等,那么实际表示应该是31 30 30 30 30、31 32 30 30。关于TPDU,大家可以查看http://blog.csdn.net/johnson2008t/article/details/51957330,这里就不多说了。接下来就是重点了,位图。位图就是告诉别人我用的哪些域传的信息,那么这些域到底用8个字节怎么表示,又是怎么来的呢?具体实现请看下一篇https://my.oschina.net/u/2489142/blog/1623551

 

以上为个人见解,不当之处欢迎大家指正,不胜感激!

转载于:https://my.oschina.net/u/2489142/blog/1623387

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值