全面掌握ISO8583报文协议 最 开始时,金融系统只有IBM这些大的公司来提供设备,象各种主机与终端等。在各个计算机设备之间,需要交换数据。我们知道数据是通过网络来传送的,而在网 络上传送的数据都是基于0或1这样的二进制数据,如果没有对数据进行编码,则这些数据没有人能够理解,属于没有用的数据。起初的X.25、SDLC以及现 在流行的TCP/IP网络协议都提供底层的通讯编码协议,它们解决了最底层的通讯问题,能够将一串字符从一个地方传送到另一个地方。但是,仅仅传送字符串 是没有太大意义的,怎样来解析字符串代表什么内容是非常重要的,否则传送一些“0123abcd”的字符串也是无用的乱码。
让我 们随着时光回到几十年前的某个时刻,假设我们被推到历史的舞台上,由我们来设计一个通用报文协议,来解决金融系统之间的报文交换,暂且称该协议叫做 ISO8583协议。此时,技术是在不断的前行,当初IBM一支独秀的局面好像已经不妙了,各种大小不一的公司都进入金融行业以求能有所斩获,呈一片百花 齐放的局面。我们怎样来设计一个报文协议,能够将这些如雨后春笋般出现的所有公司都纳入进来,其实也不是一件很简单的事。
我们还 是先一步步的来考虑吧。金融行业其实涉及到的数据内容并不是成千上万,无法统计,恰恰相反,是比较少的。我们都可以在心底数得过来,象交易类型、帐号、帐 户类型、密码、交易金额、交易手续费、日期时间、商户代码、2磁3磁数据、交易序列号等,把所有能够总结出来的都总结起来不过100个左右的数据。那我们 可以首先简单的设计ISO8583,定义128个字段,将所有能够考虑到的类似上面提到的“帐号”等金融数据类型,按照一个顺序排起来,分别对应128个 字段中的一个字段。每个数据类型占固定的长度,这个顺序和长度我们都事先定义好。这样就简单了,要发送一个报文时,就将128个字段按照顺序接起来,然后 将接起来的整串数据包发送出去。
任何金融软件收到ISO8583包后,直接按照我们定义的规范解包即可,因为整个报文的128个 字段从哪一位到哪一位代表什么,大家都知道,只要知道你的数据包是ISO8583包即可,我们都已经定义好了。比如第1个字段是“交易类型”,长度为4 位,第2个字段位是“帐号”,为19位等等。接收方就可以先取4位,再取接着的19位,依次类推,直到整个数据包128个字段都解完为止。
其实这种做法真是简单直接,基本上就可以满足需要了。不过我们有几个问题要思考下:
1、 我怎么知道每个字段的数据类型呢,是数字还是字符?
2、 每个传送的报文都把128个字段都传过去,那网络带宽能够承受得了,有时候我可能只需要其中5个字段,结果多收到了123个无用的字段。
3、 如果我某些字段的长度不固定,属于变长怎么办,因为你现在解包是当作数据包每个字段都是固定的,用C语言解包时直接依靠指针取固定长度的一串字符做为一个字段。
我们来一一解决这些问题。
第一个问题简单,我在定义ISO8583时除了定义每个字段表示什么,还规定其内容是数字或是字符等即可。考虑可能出现的类型不过有以下几种:字母、数 字、特殊字符、年月日等时间、二进制数据。比如我对128个字段中的“商户类型”字段定义其长度是15,同时定义其类型为字母。再精细点,如果“商户类 型”里面的数据同时包括数字和字母呢?那我们就定义其类型为字母也可,为数字也可,即一个字段可以同时属于多个类型。
第二个问题 稍微复杂点。其本质就是如果我只传128个字段的5个字段,接收方怎么知道我传了哪几个字段给它了。要是我们把剩下的123全部填成0或其他特殊标识,标 明该字段不需要使用?这种处理方法没有半点用处,没有解决网络带宽的本质问题,还是要传128个字段。
换个思路,我在报文前面加 上个包头,包头里面包含的信息能够让别人知道只传了5个字段。怎样设计这个包头,可以这样,我们用2个字节,即128个bit(一个字节等于8bit)来 表示128个字段中的某个字段是否存在。每个bit在计算机的二进制里面不是1就是0,如果是1就表示对应的字段在本次报文中存在,如果是0就是不存在。 这样好了,如果别人接收到了ISO8583报文,可以先根据最前面的报文头,就知道紧接着报文头后面的报文有哪些字段,没有哪些字段了。比如,我要发送5 个字段,分别属于128个字段中的第2、3、6、8、9字段,我就可以将128bit的报文头填成011001011000000000………..,一共 128个bit,后面就全是0了。注意其中第2、3、6、8、9位为1,其他都为0。
有了这个128bit的报文头,我们就可以 只发送需要的5个字段了。怎样组织报文?先放上这128bit,即2个字节的头,然后在头后面放2、3、6、8、9字段,这些字段紧挨在一起,3和6之间 也不需要填上4、5这两个字段了。接收方收到这个报文,它会根据128bit的报文头来解包,它自然知道把第3个字段取出后,就直接在第3字段的后面取第 6个字段,每个字段的长度在ISO8583里面都定义好了,很轻松就把数据包解出来了。
这下好了,为了解决上面的第二问题,我们 只是在报文中增加了2个字节的数据,就轻松搞定了,我们把这2个字节称为bit map,即位图,用来表示某个位是否存在。不过我们再稍微优化一下,考虑到很多时候报文不需要128个字段这么多,其一半64个字段都不一定能够用完。那 我可以将报文头由128bit减到64bit,只有在需要的时候才把剩下的64bit放到报文里面,这样报文长度不又少了1个字节吗?
是个好主意。我们把ISO8583的128个字段中最常见的都放到前64个字段中,那我们可以将处理缩小一倍。这样我一般发送报文时只需发送64bit, 即一个字节的报文头,再加上需要的几个字段就可以了。如果有些报文用到64到128之间的字段呢?这个也好办,我把64bit报文头的第一位bit用来代 表特殊含义,如果该bit为1,则表示64bit后面跟了剩下的64bit报文头;如果第一位bit为0,则表示64bit后面没有跟剩下的64bit报 文头,直接是128个字段中的报文了。那们,接收方会判断一下报头的第一个bit是1还是0,从而知道报文头是64bit还是128bit了,就可以做相 应处理。因为报文头第二个64bit属于有时候有,所以我们叫它Extended bit map扩展位图,相应的报文头最开始的64bit我们叫它Primary bit map主位图。我们直接把扩展位图固定放到128个字段的第一个字段,而主位图每个数据包都有,就强制性放在所有128个字段的前面,并不归入128个字 段中去。
第三个问题可以考虑这样解决。比如第2个字段是“帐号”,是不定长的,可能有的银行帐号是19位,有的是17位等。我们 定ISO8583规范时可以规定第2个字段是25位,这下足够将19和17的情况都包含进来,但是如果以后出现了30位的怎么办?那我们现在将字段定为 100位。以后超过100位怎么办,况且如果你只有19位的帐号,我们定义了100位,那81位的数据不是浪费了网络的带宽。看来预先定义一个我们认为比 较大的位数是不太好的。
我们这样,对于第2个字段“帐号”,在字段的开头加上“帐号”的长度。比如帐号是 0123456789,一共10位,我们变成100123456789,注意前面多了个10,表示后面的10位为帐号。如果你接触过COM里面的 BSTR,应该对这种处理比较熟悉了。接收方收到该字段后,它知道ISO8583规定第2个字段“帐号”是变长的,所以会先取前面的2位出来,获取其值, 此时为长度,然后根据该长度值知道应该拷贝该字段后面哪几位数据,才是真正的帐号。如果你觉得长度如果只有两位最多只能表示99位长,不太够,我们也定义 可以允许前面3位都为长度的变长字段,这样就有999位长,应该够了吧。在规范里面如果我定义某个字段的属性是“LLVAR”,你注意了,其中的LL表示 长度,VAR表示后面的数据,两个LL表示两位长,最大是99,如果是三位就是“LLLVAR”,最大是999。这样看我们定义的ISO8583规范文档 时直接根据这几个字母就理解某个变长字段的意思了。
该解决的几个问题到这里都解决了,我们来回顾下自己设计的ISO8583规 范。其实没有什么,无非是把金融行业可能出现的数据分门别类,排好顺序,接着把它们连接起来,组成一个报文发送出去而已。其中针对该报文的设计进行了一些 优化,引入了bit map位图的概念,也算是一个不错的想法。
剩下的工作就简单了,我们就直接收集金融行业可能出现的数据字段类型,分成128个字段类型,如果没有到128个这么多就先保留一些下来,另外考虑到有些人有特殊的要求,我们规定可以将128个字段中的几个字段你自己来定义其内容,也算是一种扩展了。
这样,最后我们就得到了ISO8583规范的那张字段描述表了。想要详细的知道每个字段的含义直接对着表看就可以,比较简单。
转自 http://hi.baidu.com/crduan/item/d7eadd2363114b8d9d63d1d7
分享到:
相关推荐
在Java中,可以使用`javax.crypto`包提供的API来实现这些加密算法。在8583报文的处理中,敏感数据如卡片号、交易金额等可能需要加密后再发送,以保护信息安全。解包时,接收到的密文需要解密恢复为明文。 具体实现...
以下是对ISO8583包的详细介绍: 1. **包结构**: ISO8583包由128个字段域组成,每个域都有其特定的含义和作用。这些字段分为基本字段(1-64)和扩展字段(65-128)。在包的开头有一个位图,用于指示哪些字段在当前...
8583抓包工具是专门用于处理银行和银联之间通信协议的工具,它主要针对8583协议进行数据包的捕获、解析、MAC计算以及解包操作。8583协议,全称为ISO 8583,是国际标准化组织(ISO)制定的一种金融交易消息传输标准,...
8583协议,全称为ISO 8583,是一种国际通用的金融交易报文标准,主要用于银行间以及银行与商户之间的电子数据交换(EDI)。这个标准定义了各种金融交易,如借记、贷记、查询、授权等,通过数字编码的方式进行传输。...
8583报文协议是金融行业广泛应用的一种通信标准,主要用于银行间交易,如转账、查询、授权等。它的全称是ISO8583,由国际标准化组织(ISO)制定,旨在提供一种高效、安全的数据交换格式。下面将详细阐述8583报文协议...
8583是一种基于ISO8583标准的金融交易报文格式,广泛应用于银行卡、支付系统等领域的数据交换。这个标准定义了多种类型的交易,每个类型由一系列字段组成,每个字段都有特定的含义和数据格式。在描述中提到的"自定义...
软件介绍: ISO8583报文自动解包组包工具Iso8583tools,填空上IP地址和端口,用于解析生成ibox8583报文、解析生成iso8583包,生成或解析JSON包,每个域还可以自己定义与配置,使用方便。
《银联8583位图工具:深入解析金融报文处理》 在金融通信领域,8583报文标准扮演着至关重要的角色。它是由中国银联制定的一种用于电子支付系统间交换数据的协议,是金融交易数据传输的核心规范。本文将详细探讨...
java环境下可执行的jar,解压后直接点击双击bat文件就可以执行,注意,一定需要java环境
"拆解金融报文包ISO8583工具"是为了帮助专业人士解析和理解这些复杂的报文结构而设计的。在本文中,我们将深入探讨ISO8583协议、Bitmap的计算方法以及如何使用这样的工具进行报文处理。 ISO8583协议起源于1987年,...
ISO8583协议中的一些数据元素需要进行特定的编码或解码,比如十进制转二进制、BCD编码等。在`Iso8583Util.java`中,可能会存在处理这些编码转换的辅助函数。 5. **`Helloworld.java`**: 这个文件可能是展示如何...
1. `iso8583`包:包含了核心的ISO8583消息处理逻辑,如定义消息结构、打包和解包函数。 2. `config`包:提供配置功能,允许用户自定义ISO8583消息字段的类型和长度,以适应不同版本或定制的ISO8583规范。 3. 示例...
8583报文是一种广泛应用于金融行业,特别是银行卡交易中的标准报文格式。它是由国际金融电讯协会(SWIFT)制定的,用于在银行系统间传递交易信息,如授权、清算、对账等。8583报文结构严谨,通过一系列预定义的域来...
《深入理解8583报文解析程序》 在金融交易系统中,ISO8583报文标准占据着至关重要的地位。它是一种国际通用的金融消息传输协议,广泛应用于银行间、银行卡组织与成员银行之间的信息交互。本文将围绕“8583报文解析...
ISO8583-JSON-XML 该库用于将消息从一种格式转换为另一种格式。 支持的格式为ISO 8583,JSON和XML。 初学者在使用ISO 8583格式解析和构建数据时经常遇到困难。 大多数程序员对诸如JSON和XML之类的人类可读格式更加...
ISO8583Library_ISO8583_java_是一个专门针对Java平台的ISO8583消息处理库。ISO8583是金融业广泛使用的通信协议,主要用于银行卡交易和其他金融消息交换。这个库允许开发者在Java应用程序中方便地解析、构建和处理...
**iOS POS8583报文组装工具详解** 在金融交易系统中,特别是与银行卡支付相关的领域,ISO 8583报文标准扮演着至关重要的角色。它是一种用于金融机构间传输交易信息的国际标准,涵盖了信用卡、借记卡、ATM、POS等...
8583报文在金融行业中是用于电子支付和银行间数据交换的一种标准格式,源自ISO 8583标准。这个标准定义了交易信息如何被编码和传输,包括交易类型、金额、日期时间等关键要素。位图计算器是处理8583报文时非常重要的...
银联8583报文接口规范是金融行业中极为重要的通信协议,主要用于银行卡交易和银行间数据交换。这个规范基于国际标准ISO8583,是银联网络中处理各种金融交易的基础。以下是对该规范的详细解读: 一、ISO8583报文结构...
"可加工成标准ISO8583包的组织方法"意味着该程序类不仅能够解析类银联的8583报文,还能将其转换成符合ISO8583标准的报文格式,这在跨银行系统交互时非常关键,因为不同的银行可能采用略有差异的实现,但都需遵循ISO...