8583报文

ISO8583报文(简称8583包)又称8583报文是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。
8583包前面一段为位图,用来确定包的字段域组成情况。
其中位图是8583包的灵魂,它是打包解包确定字段域的关键, 而了解每个字段域的属性则是填写数据的基础。在POS机的开发上时经常要用到,例如回头客会员管理系统在POS机上的应用就是采用8583报文。
 

如将位图的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。
如使用某数据域,应该在位图中将相应的位设位'1',如使用41域,需将位图的41位设为'1'。
选用条件:如使用65到128域,需设位图域第一位为'1'

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, NULL,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, NULL,0},
/* FLD 33 */ {0,"FORWARDING INSTITUTION ID. CODE ", 11, 0, 2, 0, NULL,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 73 */ {0,"NO USE ", 6, 0, 0, 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 107 */ {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},

如第二域:域名为主帐号,
数据类型为string
长度为22(最长长度不得超过此数)
是个2位变长域
由于是2位变长,在打包时需在数据域前加上数据的实际长度,如为19位,则表示为:
19+数据值(即前两位为长度)
如第三域:域名为处理码,
数据类型为string
长度为6
是个定长域
必须填满6位。


64个域的报文来举例

   
数量是这么规定的,有三种情况:
    
首先是定量,也就是说定义一个抽屉放30瓶药,就放30瓶一瓶也不能多,一瓶也不能少。
    
其次是LLVAR,也就是说用1位字节定义数量,比如0x12表示里头放12瓶,当然你也可以理解为16+2=18瓶。但要是0x12表示12,那0x13就等于13,不要0x12=120x13=19
    
最后是LLLVAR,2位字节表示数量,比如0x01,0x04 = 104

    
域也就是这样的,一共有64个域,每个域预先定义了内容和长度

有一个叫做BITMAP的,也就是位图,定义了一个数据包里包含
了几个域。举个例子
20 00 38 00 00 00 00 34
你把它解开,排列一下
20 = 0010 0000
00 = 0000 0000
38 = 0011 1000
依次类推,得到一串数字
0010 0000 0000 0000 0011 1000 0000 0000 0000 0000 0000 0000 0000 0000 0011 0100
然后从左到右数一下里头含有1的是那几位,上面的例子我们得到
3 19 20 21 59 60 62 ,
这几位含有1。也就是说接下来的报文包含有这几个域。

好了说了那么多,我们来做一个简单的例子比如消费交易,需要上送交易类型,卡号等等,定义如下

卡号2LLVAR BCD 5309987876545342
交易类型3长度6BCD 900000
金额4长度12BCD 100
时间7长度8BCD 20030802
2
磁道信息35LLVAR ASCII 123456
3
磁道信息36LLLVAR BCD 123456001
商户号41LLVAR ASCII 98765432

好了我们现在开始打包,首先按照长度和类型把上面的数据处理一下
卡号165309987876545342
交易类型 900000
金额000000000100
时间20030802
2
磁道06313233343536
3
磁道0009123456001
商户号 083938373635343332

接下来我们按照域信息生成位图
因为有第2域,所以第二个位置是1,由第三域,所以第三个位置
1,。。。
依此类推得到一串数字
0111 0010 0000 0000 0000 0000 0000 0000 0011 0000 1000 0000 0000 0000 0000 0000
转换过来,就是
72 00 00 00 30 80 00 00
这个就是BITMAP
然后把上面的数据按照BITMAP+每个域的内容,依次排列
就得到这个包的内容了
7200000030800000165309987876545342900000000000000100
20030802063132333435360009123456001083938373635343332
前头再加上TPDUMSGID就是最后的数据包

很简单把,解包也一样的。


现在我们有ISO8583报文如下(十六进制表示法):

60 00 03 00 00 60 31 00 31 07 30 02 00 30 20 04 C0 20 C0 98 11 00 00 00 00 00 00 00 00 01 00 03 49 02 10 00 12 30 62 25 82 21 12 99 63 01 5D 15 11 10 10 00 00 35 36 38 35 32 33 31 34 32 33 35 32 31 34 35 32 36 38 35 39 32 33 36 31 35 36 C6 24 83 4D 36 7E 9E 9E 20 00 00 00 00 00 00 00 00 13 22 00 00 08 00 05 00 36 37 41 32 32 39 39 41



第一步

POS终端上送POS中心的消息报文结构包括TPDU、报文头和应用数据三部分:



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

——应用数据说明:一般长度都是4个字节,压缩时用BCD码表示为2个字节的长度的数值。

所以上述报文中前五个字节为TPDU,即60 00 03 00 00

报文头占用六个字节,即 60 31 00 31 07 30

应用数据占用2个字节,即 02 00 也就是"0200"

——0200金融类请求消息:

●  POS查询请求。

●  POS消费请求。

●  POS消费撤销请求。

●  POS预授权完成(请求)请求。

●  POS预授权完成撤销请求。

●  电子现金脱机消费请求。

●  分期付款消费请求。

●  分期付款消费撤销请求。

●  基于PBOC电子钱包/电子现金的IC圈存类交易请求。

●  磁条卡现金充值请求。

第二步

分析位图:

首先取第十四个字节,即0x30 ,转化为二进制为0011 0000,在该字节的第一位为0(从左往右)表示当前报文中只需包括64个域,也就是从当前字节开始连续8个字节为位图(包括当前字节),如要包括128个域,该位为1。

现在进入关键的位图分析,现在我们取到了表示位图的8个字节即30 20 04 C0 20 C0 98 11,转为二进制为

00110000 00100000 00000100 11000000 00100000 11000000 10011000 00010001

位图中为1的位置即代表相应的域,在上面的二进制位中从左往右有第3位、第4位、第11位、第22位、第25位、第26位、第35位、第41位、第42位、第49位、第52位、第53位、第60位、第64位。

下面开始这些域中的数据,首先分析3域,3域为交易处理码,压缩成BCD码后占定长3个字节,我们从位图所占的8个字节后开始连续取3个字节,即 00 00 00,解压后即为“000000”,具体代表含义这里就不叙述了。

4域为交易金额,压缩成BCD码后占定长6个字节,同理取6个字节,即00 00 00 00 00 01,也就是金额0.01元,具体转换参考银联规范。

11域为受卡方系统跟踪号(流水号),压缩成BCD码占定长3个字节,同理取3个字节,即00 03 49,即000349。

22域为服务点输入方式码,压缩成BCD码占定长2个字节,同理取2个字节,即02 10,由于22域本身只占3个字节,压缩时左靠,右补0,所以转换为“021”,具体含义不再叙述。

25域为服务点条件码,压缩成BCD码占定长1个字节,同理取1个字节,即00,转换为“00”,“00”代表正常提交。

26域为服务点PIN获取码,压缩成BCD码占定长1个字节,同理取1个字节,即12,转换为“12”,表示服务点设备所允许输入的个人密码明文的最大长度为12。

解下来的35域由于不是定长,所以处理方法不同,先取一个字节,即30,转换为“30”,表示第二磁道的数据占用30个字节,取连续15个字节即62 25 82 21 12 99 63 01 5D 15 11 10 10 00 00,这里不对这串数据进行说明了。

41域为受卡机终端标识码,占8个字节的定长域,取35 36 38 35 32 33 31 34。

42域为受卡方标识码,占15个字节的定长域,取32 33 35 32 31 34 35 32 36 38 35 39 32 33 36。

49域为交易货币代码,占3个字节的定长域,取31 35 36。

52域为个人标识码数据,占8个字节的定长二进制数域,取C6 24 83 4D 36 7E 9E 9E。

53域为安全控制信息,压缩成BCD码占8个字节定长域,取20 00 00 00 00 00 00 00。

60域为自定义域,为不定长域,先取长度(压缩成BCD码占两个字节),即00 13,转换为13即占60域占13个字节,压缩成BCD码占7个字节,取22 00 00 08 00 05 00。

64域为报文鉴别码,占定长8个字节,取最后八个字节36 37 41 32 32 39 39 41。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近在做中国银行的一个快捷支付渠道,使用的是 ISO8583 协议,一开始用的是JPOS框架,但是感觉框架比较臃肿,而且档也比较少。在等待银行专线的过程中,自己闭门造车做了一个简单的8583解析框架 —— Simple8583,将程序重写了一遍,渠道中的代码量少了不少,这几天中行的接口在测试环境终于调试完成了。抽空分享一下这段时间自己学到的知识。 数据类型与编码格式: 根据接触到的数据类型将数据分为如下几种类型:          CHAR(asc编码,直接使用字符串的getBytes(ENCODING)方法获取字节数组)   BINARY(二进制编码,在打包时将8位01值组装为一个字节),             NUMERIC(BCD编码,即8421码),                LLVAR(变长域,采用ASC编码,每个LLVAR类型的域前会有1字节的域字节长度,表示长度的字节用BCD编码表示)                LLLVAR(变长域,与LLVAR域类似,不同之处在于每个LLLVAR域前会有2字节的域字节长度,长度同样以BCD编码表示)             LLVAR_NUMERIC(变长域,采用BCD编码,前有1字节的长度,长度为域值的长度,而非字节长,如域值为123456,编码后长度为3字节,但是表示域长的字节值为6)       如果用到其它数据类型可以在IsoType中进行添加,并在IsoField中添加处理操作 BitMap:        BitMap是ISO8583的精髓所在,ISO8583支持64域和128域两种,但是并非每次请求都会将所有域都请求过去,BItMap就起到了标识哪些域是有效的请求域,接收方也会根据BitMap中约定的值对域进行解析。   那么BitMap又是如何工作的呢?          首先,BItMap分为8字节和16字节两种情况,分别表示支持64域和128域,其第一位值为1,表示BitMap为16字节,否则为8字节。       其次,BitMap中的每一位对应数据域的第几域,有效域会置为1,比如01001000表示第二域和第5域为有效位。 在Simple8583中具体的实现是通过BitMap类实现的,具体可参考源码。 mti:            mti即 message type identifier消息类型标识,为4位bcd编码的数字标识符,用于描述信息的类型。 同一个mti可以用于标识多个不同的交易,比如一般常用的0200可以用来表示消费交易,消费撤销,分期付款消费和分期付款撤销,但是对于同一个mti标识的数据域类型定义是类似的。           具体的实现,我将Simple8583的xml件设置为了两部分,一部分为公用的头,如msgLength,tpdu,bitmap等,另外一部分分按照mti的不同分为多个package体。 粗略的实现流程:          1)组装请求的Map数据(只组装需要的数据域,key值为对应的数据域或包头的值)          2)请求数据进入SimpleClient代理,SimpleClient根据传入的值解析xml件(jaxb实现,做了缓存)          3)根据传入值的mti寻找对应的IsoPackage类,对找到的IsoPackage类进行clone(避免污染),对clone值中的域进行值处理和格式化         4)生成BitMap,计算Mac值(如有)          5)使用ByteArrayOutputStream将组装成的IsoPackage域值进行拼装成为一个大的byte数组,在byte前拼装两个字节的长度          6)通过Socket将数据发送并接受响应(读取前两个字节长度,根据长度获取其剩余),根据IsoPackage解析域,解析得到BitMap后根据BitMap对数据域进行解析,并将值都放入到对应的field中          7)将数据都放在Map中返回,并进行MAC校验(如有) 标签:Simple8583
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值