[原创]java创建ISO8583报文字符流
8583协议

ISO8583报文协议最开始时,金融系统只有IBM这些大的公司来提供设备,象各种主机与终端等。
在各个计算机设备之间,需要交换数据。
我们知道数据是通过网络来传送的,而在网络上传送的数据都是基于0或1这样的二进制数据,如果没有对数据进行编码,则这些数据没有人能够理解,属于没有用的数据。
起初的X.25、SDLC 以及现在流行的TCP/IP网络协议都提供底层的通讯编码协议,它们解决了最底层的通讯问题,能够将一串字符从一个地方传送到另一个地方。
但是,仅仅传送字符串是没有太大意义的,怎样来解析字符串代表什么内容是非常重要的,否则传送一些“0123abcd”的字符串也是无用的乱码。
让我们随着时光回到几十年前的某个时刻,假设我们被推到历史的舞台上,由我们来设计一个通用报文协议,来解决金融系统之间的报文交换,暂且称该协议叫做ISO8583协议。
此时,技术是在不断的前行,当初IBM一支独秀的局面好像已经不妙了,各种大小不一的公司都进入金融行业以求能有所斩获,呈一片百花齐放的局面。
我们怎样来设计一个报文协议,能够将这些如雨后春笋般出现的所有公司都纳入进来,其实也不是一件很简单的事。
我们还是先一步步的来考虑吧。
金融行业其实涉及到的数据内容并不是成千上万,无法统计,恰恰相反,是比较少的。
我们都可以在心底数得过来,象交易类型、帐号、帐户类型、密码、交易金额、交易手续费、日期时间、商户代码、2磁3磁数据、交易序列号等,把所有能够总结出来的都总结起来不过100个左右的数据。
那我们可以首先简单的设计ISO8583,定义128个字段,将所有能够考虑到的类似上面提到的“帐号”等金融数据类型,按照一个顺序排起来,分别对应128个字段中的一个字段。
每个数据类型占固定的长度,这个顺序和长度我们都事先定义好。
这样就简单了,要发送一个报文时,就将128个字段按照顺序接起来,然后将接起来的整串数据包发送出去。
任何金融软件收到ISO8583包后,直接按照我们定义的规范解包即可,因为整个报文的128个字段从哪一位到哪一位代表什么,大家都知道,只要知道你的数据包是ISO8583包即可,我们都已经定义好了。
8583协议理解

8583协议理解ISO8583报⽂(简称8583包)⼜称8583报⽂是⼀个国际标准的包格式,最多由128个字段域组成,每个域都有统⼀的规定,并有定长与变长之分。
8583包前⾯⼀段为位图,⽤来确定包的字段域组成情况。
其中位图是8583包的灵魂,它是打包解包确定字段域的关键,⽽了解每个字段域的属性则是填写数据的基础。
在POS机的开发上时经常要⽤到,例如回头客会员管理系统在POS机上的应⽤就是采⽤8583报⽂。
报⽂的类型有很多种,⽐如:sale,reversal,settlement等等,不同的类型组包也是不⼀样的, 下⾯是“消费”类型报⽂的测试和组8583报⽂的过程,针对我们⽇常使⽤POS机系统来说的,这⾥主要是模拟的POS终端发向POSP系统的8583报⽂。
其基本业务流程图如下所⽰基础知识:1byte = 8bit1byte = 2个16进制数2个字节=1个字符BCD码:⽤4位⼆进制数来表⽰1位⼗进制数中的0~9这10个数码,即1bcd码=4bit报⽂结构:TPDU头 = ID(60H) + ⽬的地址(N4) + 源地址(N4),长度为10字节,压缩时⽤BCD码表⽰为5个字节长度的数值。
报⽂头 = 应⽤类别定义(N2 )+软件总版本号(N2) + 终端状态(N1) + 处理要求(N1)+ 软件分版本号(N6),总长度为12字节,压缩时⽤BCD码表⽰为6个字节长度的数值。
报⽂长度(2字节)+TPDU(5字节)+报⽂头(6字节)+域数据(指令码(0域 2字节消息类型)+位图(8字节)+其他域数据POS终端上送POS中⼼的消息报⽂结构包括TPDU、报⽂头和应⽤数据三部分:16进制报⽂:007b 6000160000 602200000000 0200 7020048020c08811600016000060220000000002007020048020c08811165477666265921222000000000000014959555556022000375477666265921222d25085060000012600000青⾊背景:报⽂长度 007b 如上是246个字节->123个字符->长度是123(10进制)->7b(16进制)->占⽤两个字节007b黄⾊背景:TUDU头 6000160000红⾊背景:报⽂头 602200000000磁条卡⾦融⽀付类应⽤为:60软件版本号 22终端状态 0(正常交易状态)处理要求 0(⽆处理要求)保留使⽤ 000000灰⾊背景:消息类型 0200绿⾊背景:bitmap位图,转成bit显⽰, 7020048020c08811根据⽂档我们可以轻易的得到需要的域为2,3,4,11,22,25,35,41,42,49,53,60,64域(6) 2域165477666265921222(16个字节,最⼤是19个字节) 主账号N..19(LLVAR),2个字节的长度值+最⼤19个字节的主账号,压缩时⽤BCD码表⽰的1个字节的长度值+⽤左靠BCD码表⽰的最⼤10个字节的主账号。
8583报文实例

18583报文1.1数据包格式ISO 8583金融交易信息数据包由信息类型(MSG_TYPE_ID)、一个或多个位图(BIT_MAP)和按位图描述的顺序排列的数据元序列(ELEMENTS)等三段组成。
信息类型是一个4位数字的数字型字段,用来描述每一个交易信息的类别和功能,其中前两位数字标明信息类别,如授权信息、金融交易信息、管理信息,等等。
在一个金融系统中,信息类型的定义应该是唯一的,无二义性的。
网间交易具有不同的信息类型定义时应在交换报文的发送前和接收后完成类型转换处理。
位图由64位二进制比特位构成,每一位用1或0来表示与该比特位相对应的数据元存在或不存在。
位图的第一位为1时,表示64位的位图后紧接着一个扩展的64位位图。
本实施规范未使用扩展位图。
数据元指交易中一个数据项的实际内容,数据元在数据包中是否存在及存放位置由位图中的相应比特位确定。
一些数据元有固定的长度,一些数据元为变长项。
具有可变长度类型的数据元应在实际数据之前附加标明长度的前缀字节。
1.2符号定义本规范使用以下标识符来说明数据元的属性:1.2.1一般描述1.2.2长度属性1.2.3数据元值ASCII 表示该字段采用ASCII码表示,长度按字节计。
BCD 表示该字段采用BCD码表示,即每四比特位表示一数据位。
BIN 二进制数据,长度按比特位表示。
1.2.4数据属性1.2.5数据项使用规则a)所有独立的数据项按整字节计算。
b)以BCD码(Binary Code Decimal)表示的n型数据项,奇数长度(固定长度)n型数据项以字节边界右靠,左填0;例1234567表示为01234567共4个字节。
可变长度n型数据(如主帐号域)以字节边界左靠,右填0;例:1234567表示为1234570共4个字节。
c)可变长度数据项的长度域,以独立数据项n型数对待。
例LL 表示为ll一个字节,LLL表示为0lll共2字节。
d)z型数据项与n型数据项类似,为16进制数据。
报文模拟测试(含8583)工具介绍

回归测试工具用户手册目录目录 (2)工具描述 (4)功能特点 (5)适用范围 (6)文件目录结构说明 (7)case目录 (7)file目录 (7)ini目录 (7)log目录 (8)report目录 (8)主界面 (8)使用说明 (9)密钥配置界面 (9)通讯参数配置界面 (10)修改案例界面 (11)文本模式修改界面 (12)设置案例集界面 (12)报文属性设置 (13)常量设置界面 (14)发送案例 (15)发送次数 (15)清空 (15)终止发送 (15)清空日志 (15)文件格式说明 (16)config.ini 例子 (16)Case.ini 例子 (16)iso.ini 例子 (17)交易文件的配置 (18)正交易配置 (18)反交易配置 (19)可选配置 (20)支持函数列表 (21)String (21)time (21)Req (21)Rev (21)Def (21)Tlv (22)Tlvasc (22)更新计划 (23)修改记录 (23)工具描述系统用Visual C++软件开发而成,数据存储采用文本文件进行保存,便于开发测试人员修改、共享测试案例。
本软件可以模拟不同类型的交易报文,可以对交易测试案例进行统一管理,并可以进行简单时间统计和成功率统计。
使用本软件可以减轻传统测试过程中的修改-编译-测试-的循环等待时间,在测试过程中可以根据需要随时更改报文内容。
本软件支持任意格式的报文,可以模拟不同格式的报文,如定长,变长,XML,8583等报文。
每个域的内容可以是常量,也可以支持约定的表达式。
本软件可以根据需要设置对应答相关域进行合法性检查,可以校验应答报文和请求报文的匹配关系,可以校验域的长度,校验域的内容等。
本软件支持MAC的生成、校验以及PIN加密处理,同时可以根据需要调整是否需要进行MAC和PIN加密。
本软件运行程序无需安装,只需将相关程序和测试案例文件拷贝到相应的文件夹下即可执行。
8583报文解析实例

8583报文解析实例8583报文解析实例:以下是主机从网控器收到的消费数据包(用二位十六进制数表示一个字节):0201 0630 30 30 30 3000 06 30 30 30 30 30 31| 03 22备注:|…|之间是8583数据包(|是人为加的);颜色只作为各个域区分,没其他含义。
解包分析:02 表示是数据开始01 06 表示后面数据长度为106个字节(在06到结束符03之间,不包括03字符,即8583包)60 00 07 08 08 是网控tpdu的地址02 00 8583包开始,表示交易信息码 message_id消费信息码为020030 20 05 00 20 c0 02 01 是数据包的位图,8个字节,64位,3的二进制0011第一位为0,所以没有扩展位图,二进制展开后如下域有信息: 3 4 11 22 24 35 41 42 52 60 61 6203 是数据结束??31 是crc校验:02后面开始,即从01开始到03之间字??节(包括03)异或的结果。
??数据元解包分析:实据元是从位图后开始,到03结束之前。
位图分析有3 4 11 22 24 35 41 42 52 60 61 62 域的信息格式说明:a表示字符,n表示数字,s表示特殊字符,b二进制数据第3域:名称:处理代码格式:n6(固定长度为6的数字)截取字符:00 40 00原始数据:“004000”。
第4域:名称:交易金额格式:n12截取字符:00 00 00 00 99 80原始数据:99.80第11域:名称:系统流水号格式:n6截取字符:00 00 01原始数据:000001第22域:名称:服务点方式格式:n3截取字符:00 21原始数据: “021”第24域:名称:国际网络识别符格式:n3截取字符:00 03原始数据:“003”第35域:名称:第2磁道数据格式:llvar长度为37,取整后有19个字符截取字符:37 62 14 02 10 00 07 41 50 78 d1 56 07 12 20 10 00 00 00 00原始数据:62 14 02 10 00 07 41 50 78 d1 56 07 12 20 10 00 00 00 0第41域:名称:终端号格式:ans8 (字母,数字,特殊字符皆可,长度为8)截取字符:31 32 33 34 35 36 37 38原始数据:“12345678”第42域:名称:商户号格式:ans15截取字符:30 34 33 20 20 20 20 20 20 20 20 20 20 20 20原始数据:“043”第52域:名称:个人密码格式:b64 (表示二进制数据64位)截取字符:c5 8e b2 00 18 03 1e 9a原始数据:c5 8e b2 00 18 03 1e 9a第60域:名称:保留使用(实际存放pos的批次号)格式:lllvar长度为00 06截取字符:00 06 30 30 30 30 30 31原始数据:“000001”第61域:名称:保留使用(实际存放操作员和操作员密码)格式:lllvar长度为00 06截取字符:00 06 30 30 30 30 30 30原始数据:“000000”00操作员,0000密码第62域:名称:保留使用(实际存放pos的票据号)格式:lllvar长度为00 06截取字符:00 06 30 30 30 30 30 31原始数据:“000001”。
8583报文及各域详解

[精彩] 8583问题 作者:lcunix发表于:2006-02-19 00:03:51【发表评论】【查看原文】【C/C++讨论区】【关闭】各位高手能否详细的解释一下8583协议htldm回复于:2003-08-31 22:15:18ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。
8583包前面一段为位图,用来确定包的字段域组成情况。
其中位图是8583包的灵魂,它是打包解包确定字段域的关键,而了解每个字段域的属性则是填写数据的基础,1、位图描述如下:位图位置:1格式:定长类型:B16(二进制16位,16*8=128bit)描述:如将位图的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。
如使用某数据域,应在位图中将相应的位设位'1',如使用41域,需将位图的41位设为'1'。
选用条件:如使用65到128域,需设位图域第一位为'1'2、每个域的定义如下:typedef struct ISO8583{int bit_flag; /*域数据类型0 -- string, 1 -- int, 2 -- binary*/char *data_name; /*域名*/int length; /*数据域长度*/int length_in_byte;/*实际长度(如果是变长)*/int variable_flag; /*是否变长标志0:否2:2位变长,3:3位变长*/int datatyp; /*0 -- string, 1 -- int, 2 -- binary*/char *data; /*存放具体值*/int attribute; /*保留*/} ISO8583;ISO8583 Tbl8583[128] ={/* FLD 1 */ {0,"BIT MAP,EXTENDED ", 8, 0, 0, 2, NULL,0},/* FLD 2 */ {0,"PRIMARY ACCOUNT NUMBER ", 22, 0, 2, 0, NULL,0},/* FLD 3 */ {0,"PROCESSING CODE ", 6, 0, 0, 0, NULL,0},/* FLD 4 */ {0,"AMOUNT, TRANSACTION ", 12, 0, 0, 1, NULL,0},/* FLD 5 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},/* FLD 6 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},/* FLD 7 */ {0,"TRANSACTION DATE AND TIME ", 10, 0, 0, 0, NULL,0},/* FLD 8 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},/* FLD 9 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},/* FLD 10 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},/* FLD 11 */ {0,"SYSTEM TRACE AUDIT NUMBER ", 6, 0, 0, 1, NULL,0},/* FLD 12 */ {0,"TIME, LOCAL TRANSACTION ", 6, 0, 0, 0, NULL,0}, /* FLD 13 */ {0,"DATE, LOCAL TRANSACTION ", 4, 0, 0, 0, NULL,0}, /* FLD 14 */ {0,"DATE, EXPIRATION ", 4, 0, 0, 0, NULL,0},/* FLD 15 */ {0,"DATE, SETTLEMENT ", 4, 0, 0, 0, NULL,0},/* FLD 16 */ {0,"NO USE ", 4, 0, 0, 0, NULL,0},/* FLD 17 */ {0,"DATE, CAPTURE ", 4, 0, 0, 0, NULL,0},/* FLD 18 */ {0,"MERCHANT'S TYPE ", 4, 0, 0, 0, NULL,0},/* FLD 19 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},/* FLD 20 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},/* FLD 21 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},/* FLD 22 */ {0,"POINT OF SERVICE ENTRY MODE ", 3, 0, 0, 0, NULL, 0},/* FLD 23 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},/* FLD 24 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},/* FLD 25 */ {0,"POINT OF SERVICE CONDITION CODE ", 2, 0, 0, 0, N ULL,0},/* FLD 26 */ {0,"NO USE ", 2, 0, 0, 0, NULL,0},/* FLD 27 */ {0,"NO USE ", 1, 0, 0, 0, NULL,0},/* FLD 28 */ {0,"field27 ", 6, 0, 0, 0, NULL,0},/* FLD 29 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},/* FLD 30 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},/* FLD 31 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},/* FLD 32 */ {0,"ACQUIRER INSTITUTION ID. CODE ", 11, 0, 2, 0, NUL L,0},/* FLD 33 */ {0,"FORWARDING INSTITUTION ID. CODE ", 11, 0, 2, 0, N ULL,0},/* FLD 34 */ {0,"NO USE ", 28, 0, 2, 0, NULL,0},/* FLD 35 */ {0,"TRACK 2 DATA ", 37, 0, 2, 0, NULL,0},/* FLD 36 */ {0,"TRACK 3 DATA ",104, 0, 3, 0, NULL,0},/* FLD 37 */ {0,"RETRIEVAL REFERENCE NUMBER ", 12, 0, 0, 0, NULL,0} ,/* FLD 38 */ {0,"AUTH. IDENTIFICATION RESPONSE ", 6, 0, 0, 0, NULL,0},/* FLD 39 */ {0,"RESPONSE CODE ", 2, 0, 0, 0, NULL,0},/* FLD 40 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},/* FLD 41 */ {0,"CARD ACCEPTOR TERMINAL ID. ", 8, 0, 0, 0, NULL,0} ,/* FLD 42 */ {0,"CARD ACCEPTOR IDENTIFICATION CODE ", 15, 0, 0, 0, NULL,0},/* FLD 43 */ {0,"CARD ACCEPTOR NAME LOCATION ", 40, 0, 0, 0, NULL, 0},/* FLD 44 */ {0,"ADDITIONAL RESPONSE DATA ", 25, 0, 2, 0, NULL,0},/* FLD 45 */ {0,"NO USE ", 76, 0, 2, 0, NULL,0},/* FLD 46 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 47 */ {0,"field47 ",999, 0, 3, 0, NULL,0},/* FLD 48 */ {0,"ADDITIONAL DATA --- PRIVATE ",999, 0, 3, 0, NULL,0 },/* FLD 49 */ {0,"CURRENCY CODE,TRANSACTION ", 3, 0, 0, 0, NULL,0}, /* FLD 50 */ {0,"CURRENCY CODE,SETTLEMENT ", 3, 0, 0, 0, NULL,0}, /* FLD 51 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},/* FLD 52 */ {0,"PERSONAL IDENTIFICATION NUMBER DATA ", 8, 0, 0, 2, NULL,0},/* FLD 53 */ {0,"SECURITY RELATED CONTROL INformATION", 16, 0, 0, 0, NULL,0},/* FLD 54 */ {0,"ADDITIONAL AMOUNTS ",120, 0, 3, 0, NULL,0},/* FLD 55 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 56 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 57 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 58 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 59 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 60 */ {0,"NO USE ", 5, 0, 3, 0, NULL,0},/* FLD 61 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 62 */ {0,"NO USE ", 11, 0, 3, 0, NULL,0},/* FLD 63 */ {0,"NO USE ", 11, 0, 3, 0, NULL,0},/* FLD 64 */ {0,"MESSAGE AUTHENTICATION CODE FIELD ", 8, 0, 0, 2, NULL,0},/* FLD 65 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 66 */ {0,"NO USE ", 1, 0, 0, 0, NULL,0},/* FLD 67 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 68 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 69 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 70 */ {0,"SYSTEM MANAGEMENT INformATION CODE ", 3, 0, 0, 0, NULL,0},/* FLD 71 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 72 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 74 */ {0,"NUMBER OF CREDITS ", 10, 0, 0, 0, NULL,0},/* FLD 75 */ {0,"REVERSAL NUMBER OF CREDITS ", 10, 0, 0, 0, NULL,0 },/* FLD 76 */ {0,"NUMBER OF DEBITS ", 10, 0, 0, 0, NULL,0},/* FLD 77 */ {0,"REVERSAL NUMBER OF DEBITS ", 10, 0, 0, 0, NULL,0} ,/* FLD 78 */ {0,"NUMBER OF TRANSFER ", 10, 0, 0, 0, NULL,0},/* FLD 79 */ {0,"REVERSAL NUMBER OF TRANSFER ", 10, 0, 0, 0, NULL, 0},/* FLD 80 */ {0,"NUMBER OF INQUIRS ", 10, 0, 0, 0, NULL,0},/* FLD 81 */ {0,"AUTHORIZATION NUMBER ", 10, 0, 0, 0, NULL,0},/* FLD 82 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},/* FLD 83 */ {0,"CREDITS,TRANSCATION FEEAMOUNT ", 12, 0, 0, 0, NULL, 0},/* FLD 84 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},/* FLD 85 */ {0,"DEBITS,TRANSCATION FEEAMOUNT ", 12, 0, 0, 0, NULL,0 },/* FLD 86 */ {0,"AMOUNT OF CREDITS ", 16, 0, 0, 0, NULL,0},/* FLD 87 */ {0,"REVERSAL AMOUNT OF CREDITS ", 16, 0, 0, 0, NULL,0 },/* FLD 88 */ {0,"AMOUNT OF DEBITS ", 16, 0, 0, 0, NULL,0},/* FLD 89 */ {0,"REVERSAL AMOUNT OF DEBITS ", 16, 0, 0, 0, NULL,0} ,/* FLD 90 */ {0,"ORIGINAL DATA ELEMENTS ", 42, 0, 0, 0, NULL,0}, /* FLD 91 */ {0,"FILE UPDATE CODE ", 1, 0, 0, 0, NULL,0},/* FLD 92 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 93 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 94 */ {0,"SERVICE INDICATOR ", 7, 0, 0, 0, NULL,0},/* FLD 95 */ {0,"REPLACEMENT AMOUNTS ", 42, 0, 0, 0, NULL,0},/* FLD 96 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},/* FLD 97 */ {0,"AMOUNT OF NET SETTLEMENT ", 16, 0, 0, 0, NULL,0},/* FLD 98 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 99 */ {0,"SETTLEMENT INSTITUTION ID ", 11, 0, 2, 0, NULL,0}, /* FLD 100 */ {0,"RECVEING INSTITUTION ID ", 11, 0, 2, 0, NULL,0},/* FLD 101 */ {0,"FILENAME ", 17, 0, 2, 0, NULL,0},/* FLD 102 */ {0,"ACCOUNT IDENTIFICATION1 ", 28, 0, 2, 0, NULL,0}, /* FLD 103 */ {0,"ACCOUNT IDENTIFICATION2 ", 28, 0, 2, 0, NULL,0}, /* FLD 104 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 105 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 106 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 108 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 109 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 110 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 111 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 112 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 113 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 114 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 115 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 116 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 117 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 118 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 119 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 120 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 121 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 122 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 123 */ {0,"NEW PIN DATA ", 8, 0, 3, 2, NULL,0},/* FLD 124 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 125 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 126 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 127 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},/* FLD 128 */ {0,"MESSAGE AUTHENTICATION CODE FIELD ", 8, 0, 0, 2, NULL,0},};3、变长,定长域说明如第二域:域名为主帐号,数据类型为string长度为22(是长长度不得超过此数)是个2位变长域由于是2位变长,在打包时需在数据域前加上数据的实际长度,如为19位,则表示为:19+数据值(即前两位为长度)如第三域:域名为处理码,数据类型为string长度为6是个定长域必须填满6位。
8583报文详解

全面掌握ISO8583报文最开始时,金融系统只有IBM这些大的公司来提供设备,象各种主机与终端等。
在各个计算机设备之间,需要交换数据。
我们知道数据是通过网络来传送的,而在网络上传送的数据都是基于0或1这样的二进制数据,如果没有对数据进行编码,则这些数据没有人能够理解,属于没有用的数据。
起初的X.25、SDLC以及现在流行的TCP/IP网络协议都提供底层的通讯编码协议,它们解决了最底层的通讯问题,能够将一串字符从一个地方传送到另一个地方。
但是,仅仅传送字符串是没有太大意义的,怎样来解析字符串代表什么内容是非常重要的,否则传送一些“0123abcd”的字符串也是无用的乱码。
让我们随着时光回到几十年前的某个时刻,假设我们被推到历史的舞台上,由我们来设计一个通用报文协议,来解决金融系统之间的报文交换,暂且称该协议叫做ISO8583协议。
此时,技术是在不断的前行,当初IBM一支独秀的局面好像已经不妙了,各种大小不一的公司都进入金融行业以求能有所斩获,呈一片百花齐放的局面。
我们怎样来设计一个报文协议,能够将这些如雨后春笋般出现的所有公司都纳入进来,其实也不是一件很简单的事。
我们还是先一步步的来考虑吧。
金融行业其实涉及到的数据内容并不是成千上万,无法统计,恰恰相反,是比较少的。
我们都可以在心底数得过来,象交易类型、帐号、帐户类型、密码、交易金额、交易手续费、日期时间、商户代码、2磁3磁数据、交易序列号等,把所有能够总结出来的都总结起来不过100个左右的数据。
那我们可以首先简单的设计ISO8583,定义128个字段,将所有能够考虑到的类似上面提到的“帐号”等金融数据类型,按照一个顺序排起来,分别对应128个字段中的一个字段。
每个数据类型占固定的长度,这个顺序和长度我们都事先定义好。
这样就简单了,要发送一个报文时,就将128个字段按照顺序接起来,然后将接起来的整串数据包发送出去。
任何金融软件收到ISO8583包后,直接按照我们定义的规范解包即可,因为整个报文的128个字段从哪一位到哪一位代表什么,大家都知道,只要知道你的数据包是ISO8583包即可,我们都已经定义好了。
ISO8583报文解包和组包

javabytestringexceptionnulllist
一:IS08583包介绍:
ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。
8583包前面一段为位图,用来确定包的字段域组成情况。其中位图是8583包的灵魂,它是打包解包确定字段域的关键, 而了解每个字段域的属性则是填写数据的基础。
{37,1,12,0},
{39,1,2,0},
{40,2,50,2},
{41,1,8,0},
{48,1,52,3},
{120,2,128,3},
};
}
四:定义BitMapiso类
类说明:此类提供解析请求包和封装信息包两个方法,例如:
package com.lottery.pos.utils;
map = new byte[16];
System.arraycopy(realbody, 0, map, 0, 16);
} else {
map = map8;
}
boolean[] bmap = LoUtils.getBinaryFromByte(map);
System.arraycopy(realbody, tmplen, nextData, 0,nextData.length);
tmplen += nextData.length;
} else {
nextData = new byte[config[bit][2]];
byte[] map8 = new byte[8];
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[原创]java创建ISO8583报文字符流
/*
* 创建日期2005-8-26
*
* TODO 要更改此生成的文件的模板,请转至
* 窗口-首选项-Java -代码样式-代码模板*/
package com.trade;import java.util.HashMap;/**
* @author GYGT
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口-首选项-Java -代码样式-代码模板*/
public class ProduceTradeMessage {
//域号字长属性
private HashMap fieldPro;
//域号最大字长
private HashMap fieldLen;
//输入域值
private HashMap inputField = new HashMap();
private HashMap hexmap = new HashMap();
//报文字长
private String TradeLength;
//报文类型长度
private String TradeType;
//64位域号
private String Field64;
//128位域号
private String Field128;
//域值
private String FieldContent;
//报文字符流
private String TradeMessage;
public ProduceTradeMessage(){
inputField();
hexmap();
}
/**
* 对参数进行设置
------------------------------------------------------------------------------------------------
*
*/
private void inputField(){
inputField.put("2","22"); // 两位变长,最大长度22位
inputField.put("3","aaaaaa"); // 6位定长
inputField.put("4","aaaaaaaaaaaa");
// 12位定长
inputField.put("7","aaaaaaaaaa");
// 10位定长
inputField.put("11","aaaaaa"); // 6位定长
inputField.put("14","aaaa"); // 4位定长
inputField.put("18","aaaa"); // 4位定长
inputField.put("22","aaa"); // 3位定长
inputField.put("32","11"); // 两位变长,最大长度11位
inputField.put("33","11"); // 两位变长,最大长度11位。