`
flynow
  • 浏览: 6984 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[zz]ISO8583包简介和源代码

阅读更多

本文主要包括ISO8583包简介和源代码,下面是简介:

简介
ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。8583包前面一段为位图,用来确定包的字段域组成情况。
其中位图是8583包的灵魂,它是打包解包确定字段域的关键, 而了解每个字段域的属性则是填写数据的基础,
1、 位图描述如下:
位图位置:1
格式:定长
类型:B16(二进制16位,16*8=128bit)
描述:
如将位图的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。
如使用某数据域,应在位图中将相应的位设位'1',如使用41域,需将位图的41位设为'1'。
选用条件:如使用65到128域,需设位图域第一位为'1'
2、变长,定长域说明
如第二域:域名为主帐号,
数据类型为string
长度为22(是长长度不得超过此数)
是个2位变长域
由于是2位变长,在打包时需在数据域前加上数据的实际长度,如为19位,则表示为:
19+数据值(即前两位为长度)

如第三域:域名为处理码,
数据类型为string
长度为6
是个定长域
必须填满6位。


附A:ISO8583各域段的说明
1,信息类型(message type)定义
位图位置:-
格式:定长
类型:N4
描述:
数据包的第一部分,定义数据包的类型。
数据类型由数据包的发起者设定,应遵循以下要求:
数据包开始部分必须是信息类型;
对不支持的信息类型能给出拒绝应答。
0100授权交易
0110授权交易答复
0200金融交易
0210金融交易答复
0240查询交易
0250查询交易答复
0400冲正交易
0410冲正交易答复
0800管理交易
0810管理交易答复

2,位图(Bit Map) - 基本位图和扩展位图
位图位置:1
格式:定长
类型:B16
描述:
如将位图的第一位设为'1',表示使用扩展位图,否则表示只使用基本位图。
如使用某数据域,应在位图中将相应的位设位'1',如使用41域,需将位图的41位设为'1'。
选用条件:如使用65到128域,需设位图域为'1'

3,Bit02主帐号(Primary Account Number )
位图位置:02
格式:变长,LLVAR
类型:N..22
描述:
唯一的确认一个用户交易的基本帐号。
由于银行电子服务系统涉及多个应用系统,而帐号长度最多为22位,故将原标准的19长度改为22位。

Bit03 处理代码 (Processing Code )
位图位置:03
格式:定长
类型:N6
描述:用于描述交易对客户帐户造成何种影响的代码。
处理代码和信息码一起可唯一定义一种交易的类型。
处理代码由以下三部分组成:
位置描述
1-2交易动作码
3-4付出帐户类型,用于借记类,如查询、代收费、转场交易。
5-6收入帐户类型,用于代收费、转帐等。


其中:
ff : 付出帐户
tt: 收入帐户
* 视主机而定



5,Bit04 交易金额 (Amount, Transaction)
位图位置:04
格式:定长
类型:N12
描述:帐户人要求交易的交易金额,不含任何处理和交易费用。
金额的表示和货币代码有关,应能表示相应货币的最小单位。参ISO4217有关货币代码定义。
如“000000000100”用于表示美元,表示1.00元;如用于表示意大利货币,则表示100里拉。
对于查询等交易,应设交易金额为“000000000000”。

6,Bit07交易日期和时间Transmission Date and Time
位图位置:07
格式:定长,MMDDhhmmss
类型:N10
描述:本地交易日期和时间

7,Bit11系统跟踪号(Systems Trace Audit Number)
位图位置:11
格式:定长
类型:N6
描述:终端交易的跟踪号码。
交易发起终端填写,和“交易日期、时间”、信息类型等合在一起可唯一定义某一个终端的唯一一笔交易。即是说,在同一天,对一终端,同一类交易的系统跟踪号应保证不同。系统跟踪号在交易过程中不能修改。使用此域来匹配请求和通知类交易的返回。
应用系统使用此域来检查收到的授权、金融、自动冲正、结算、管理和网管等类交易的应答包是否是其请求包的应答。
系统跟踪号不用于匹配自动冲正交易,也不用于在预授权消费时匹配前面的预授权交易。参90域。
对于银行电子服务系统,其系统跟踪号是交易流水号。

8,Bit12本地交易时间(Time ,Local Transaction)
位图位置:12
格式:定长,hhmmss
类型:N6
描述:交易在终端上发生的时间。
本地交易时间在交易处理过程中不能改变。在自动冲正,存贮转发时,本地交易时间不能改变。

9,Bit13本地交易日期(Date ,Local Transaction)
位图位置:13
格式:定长,MMDD
类型:N4
描述:交易在终端上发生的时间。
本地交易时间不能改变,在自动冲正、存储转发交易时,本地交易时间也不能改变。

10,Bit14有效期(Date ,Expiration)
位图位置:14
格式:定长,YYMM
类型:N4
描述:卡的有效期,年年月月
由于卡类写磁格式不同,收单行可能提不出卡的有效期,授权机构从卡的二磁道中提取卡的有效期。如卡,无二磁道,收单行应要求手工录入卡的有效期。
选用条件:100、200、400等交易如没有2、3磁道时,一定要有此域。

11,Bit15结算日期(Date ,Settlement)
位图位置:15
格式:定长,MMDD
类型:N4
描述:
银行电子服务系统和主机结算的时间,格式月月日日。
结帐日期前发生的交易参加当天结算。
在结算时,结帐日期也用于计算处理、交易费用。

12,Bit17获取日期(Date ,Capture)
位图位置:17
格式:定长,MMDD
类型:N4
描述:从主机获取交易的记帐日期。通常用于主机和商户清算。

13,Bit18商户类型(Merchant's Type)
位图位置:18
格式:定长
类型:N4
描述:定义商户产品和服务类型的代码
商户类型用于金融、授权交易,用于指定服务点的类型。它主要有以下用途:
决定预授权交易得到确认的最长时间;
控制合法限额;
为交易授权处理,控制网络操作规则;
欺诈检测;
用于商户分类报表;
交易费用处理。
根据ISO8583标准,应使用相应的国家标准。
商户类型代码表如下:
商户类型代码行业类型说明
4215邮递服务
4511民航
4722旅游
4782过桥费
4789其他运输服务
4614电信服务
5542加油站
5812餐馆
5999购物
6010金融机构-人工现金支付
6011金融机构-自动现金支付
6012金融机构-各类服务
7011酒店、旅馆
7299各类个人服务:洗衣、美容、
7399各类商业服务:停车场、租车、广告、其他服务
7699各类维修服务:维修、洗车、拖车
7996娱乐:电影、剧院、体育、游戏
8099医疗服务
8111法律服务
8999各类专业服务:会计、教育、装修、工程

选用条件:服务点终端发起的交易一定要有此域。

14,Bit22服务点输入方式(Point-of-Service Entry Mode)
位图位置:22
格式:定长
类型:N3
描述:在服务终端上定义PIN和PAN的输入方式。
服务点输入方式包含以下两个方面组合而成:
位置描述
1-2在服务终端上PAN有效期输入方式
3-3在服务终端上PIN的输入方式
PAN的输入方式编码如下:
PAN输入方式描述
00不知
01手工
02读磁卡
03条码扫描仪(BAR)
04光学符号阅读器(OCR)
05集成电路卡(IC卡)

PIN的输入方式编码如下:
PIN输入方式描述
0不知
1终端能接收PIN
2终端不能接收PIN

选用条件:服务点终端发起的交易一定要有此域。

15,Bit25服务点条件代码(Point-of-Service Condition Code)
位图位置:25
格式:定长
类型:N2
描述:定义交易发生的服务点类型
用法说明:下面是CYBERBANK支持的服务点条件代码。
服务点条件代码服务点终端类型
2自动柜员机(ATM)
10银行终端(10)
14POS
20电话银行

16,Bit32收单机构标识码(Acquirer institution Identification)
位图位置:32
格式:LLVAR
类型:N..11
描述:在金融交易中此域表示交易发生的银行机构的标识码
应答数据包必须和请求数据包此域相同。

17,Bit33向前机构标识码(Forwarding Institution Identification Code)
位图位置:33
格式:LLVAR
类型:N..11
描述:在金融交易中此域表示帐户所在的银行机构的标识码
在网管交易800/810中,本域含有交易发起机构的代码。
应答数据包必须和请求数据包此域相同。

18,Bit35二磁道数据(Track 2 Data)
位图位置:35
格式:LLVAR
类型:Z..37
描述:写在卡二磁道的数据。数据组成遵循ISO7811-1985标准,数据中包含域分隔符,但不包含卡启始、结束符、LRC等。
收卡行应检测卡的二磁道是否符合国际标准。
为支持国际交换收单行应将二磁道中的分隔符换为“=”。除此外不能对二磁道数据进行任何修改,如修改PAN的校验字、有效期、服务码等。

19,Bit36三磁道数据(Track 3 Data)
位图位置:36
格式:LLLVAR
类型:Z...104
描述:写在卡三磁道的数据。数据应组成遵循ISO4909标准,数据中包含域分隔符,但不包含卡启始、结束符、LRC等。
注意:长度说明为3位数字长。

20,Bit37检索索引号(Retrieval Reference Number)
位图位置:37
格式:定长
类型:AN12
描述:检索索引号用来在任何时间标识一个金融、授权、自动冲正交易。
检索索引号不要求打印在持卡人的帐单上。它的主要目的是在收单行和授权行之间定义一个数据项用于跟踪和检索交易。授权机构可以将检索索引号打印在客户的对帐单上。
检索索引号由收单行分配。
选用条件:可包含在收单机构的交易请求中。如在交易请求中有,则应答数据中一定应原样返回。

21,Bit38授权码(Authorization Identification)
位图位置:38
格式:定长
类型:AN6
描述:交易授权机构返回的返回代码。
授权码用于在服务点终端上信用卡授权;
授权机构按网络操作规定,可选使用本域。

22,Bit39返回码(Response Code)
位图位置:39
格式:定长
类型:AN2
描述:对一交易定义其处理结果的编码。
返回码用于说明授权机构对金融(授权)交易的处理状态;也用来指明自动冲正交易的冲正原因;还用来指出目标主机已接收到文件修改、结算、管理、网管等交易请求。
返回码应尽可能准确,应尽可能描述清楚所遇到的问题和状态。网络交换主机、收单行主机有可能会按不同的返回码收取不同的交易处理费用,并执行不同的处理过程。


23,Bit41收卡单位终端标识码(Card Acceptor Terminal Identification)
位图位置:41
格式:定长
类型:ANS8
描述:定义在收单单位中定义一个服务终端的标识码,在同一商户中服务终端标识码应唯一。

24,Bit42收卡商户定义码(Card Acceptor Identification Code)
位图位置:42
格式:定长
类型:ANS15
描述:在本地和网络中定义交易单位(商户)的编码。

25,Bit43收卡商户位置(Card Acceptor Location)
位图位置:43
格式:定长
类型:ANS40
描述:在本地和网络中定义收卡单位(商户)的国家、省。城市等。
选用条件:如对外卡网络,一定要包含此域。

26,Bit44附加返回数据(Additional ResponseData)
位图位置:44
格式:LLVAR
类型:ANS..25
描述:在金融(授权)交易中授权机构返回的其他信息。

27,Bit48附加数据-私用(Additional Data-Private)
位图位置:48
格式:LLLVAR
类型:ANS...999
描述:银行电子服务系统使用此域作以下用途
存放批量查询的返回数据
其格式与输出格式表对应

28,Bit49交易货币代码(Currency Code,Transaction)
位图位置:49
格式:定长
类型:AN3
描述:按ISO4217定义的交易货币代码,用来表示“交易金额”(field04)所用的货币种类。
交易货币代码是指在收单单位进行交易所用的交易种类。

29,Bit50结算货币代码(Currency Code,Settlement)
位图位置:50
格式:定长
类型:AN3
描述:按ISO4217定义的结算货币代码,用来表示结算金额、结算处理费、结算交易费等所用的货币种类。
结算货币代码是指在进行结算和清算过程中所用的货币种类。

30,Bit52用户密码(PIN)数据(PIN Data)
位图位置:52
格式:定长
类型:B16
描述:用户在服务终端上交易用于识别用户合法性的一些数字。
PIN在分行主机用分行主机密钥按ANSIX9.8标准加密,形成密文块。
选用条件:如果在终端上输入了密码,就需要此域。

31,Bit53密码相关控制信息(Security Related Control)
位图位置:53
格式:定长
类型:AN16
描述:本域提供有关密码块的附加信息,用于指出用于PIN计算的PIN key,用于MAC计算的MAC key。
本域格式如下表所示:
0-1格式代码2N“20”
2-3PIN加密算法2N“01”:DES
4-5密文块格式2N“01”:ANSI
6PIN密钥索引1N‘1’或‘2’
7MAC密钥索引1N‘1’或‘2’
8-11MAC检查数据4B
12-15填充4N

在BOC信用卡网络中PIN和MAC各使用两个密钥---'1'号和'2'密钥,交易中计算PIN和MAC时只能各用某一个KEY,同时需将所用的KEY索引号填写此域。
选用条件:如果有PIN域或MAC域,一定需有此域。

32,Bit54附加金额(Additional Amounts)
位图位置:54
格式:LLLVAR
类型:ANS...120
描述:此域由授权行主机将客户的余额返回给收单终端,以显示或打印在客户回单上。
在此域中最多可有6个余额返回,每个余额返回格式如下:
位置描述
0-1处理码3-4或5-6位定义的帐号类型
2-3金额类型:01-帐户金额
02-可用金额
03-拥有金额
04-应付金额
40-可用取款限额
56-可用转帐限额
4-6金额的货币代码
7‘D’-借记金额,’C’-贷记金额
8-19余额数目

六个余额中必须返回可用余额,在ATM、POS上显示可用余额

33,Bit64信息确认码(MAC)
位图位置:64
格式:定长
类型:B16
描述:数据包的最后一个域,用于验证信息来源的合法性,以及数据包中数据是否未被篡改。
MAC的计算参ANSIX.99,(最后八字节未满八位者左补零,右补零?)
为提高效率,在发送者和接收者之间,只有以下一些重要的域参加MAC的计算。数据包中如果存在以下数据域,它们将参加MAC的计算。

位图域名
2基本帐号
3处理代码
4交易金额
11系统跟踪号
12本地交易时间
13本地交易日期
32收单机构代码
38授权码
39返回码
41收单终端代码
49交易货币代码
95替换金额
选用条件:只使用了1-64域的数据包使用此域。


34,Bit70管理信息码(System Management Indormation Code)
位图位置:70
格式:定长
类型:N3
描述:

用于定义和维护银行电子服务系统内部通讯网络状态和应用工作状态。
网络管理信息代码用于管理清算日期"cutoff",通讯"sign on/sign off","key exchange"等。
支持以下一些网络管理信息码
NMIC网络管理信息码动作
001签到(Sign on)
002签退(Sign off)
101交换密钥(Key exchange)
201结帐日期切换(Cutoff)
202结帐日期切换完成
301测试(Echo test)

35,Bit74贷记交易笔数(Transaction Number)
位图位置:74
格式:定长
类型:N10
描述:贷记金融交易总的成功交易次数
CYBERBANK软件在收到如下一个处理代码时会增加贷记交易次数。
交易码交易服务
00贷记,购物与服务
01贷记,取现
02贷记,调整(客户调整)

36,Bit75贷记自动冲正交易笔数(Credits,Reversal Number)
位图位置:75
格式:定长
类型:N10
描述:贷记收单行自动冲正、“ChargeBack"等交易总的交易次数
CYBERBANK软件在收到如下一个处理代码时会增加贷记自动冲正交易笔数
交易码交易服务
20贷记,退货
21贷记,存款
22贷记,调整(客户修改)

37,Bit76借记交易笔数(Debits,Number)
位图位置:76
格式:定长
类型:N10
描述:借记金融交易总的成功交易次数
CYBERBANK软件在收到如下一个处理代码时会增加借记交易次数。
交易码交易服务
00借记,购物与服务
01借记,取现
02借记,调整(客户调整)

38,Bit77借记自动冲正交易笔数(Debits,Reversal Number)
位图位置:77
格式:定长
类型:N10
描述:借记收单行自动冲正、“ChargeBack"等交易总的交易次数
CYBERBANK软件在收到如下一个处理代码时会增加借记重发交易次数,并在清算表报中反映。
交易码交易服务
20借记(!!!),退货
21借记,存款
22借记,调整(客户修改)

39,Bit78转帐交易笔数(Transfers,Number)
位图位置:78
格式:定长
类型:N10
描述:转帐的交易总次数。
系统在收到如下一个处理代码的金融交易时会增加转帐交易的次数。
交易码交易服务
40客户相关帐户间转帐


40,Bit79转帐自动冲正交易笔数(Transfers,Reversal Number)
位图位置:79
格式:定长
类型:N10
描述:转帐的自动冲正交易总次数。
系统在收到如下一个处理代码的自动冲正交易时会增加转帐自动冲正交易的次数。
交易码交易服务
40客户相关帐户间转帐

41,Bit80查询交易笔数(Inquiries,Number)
位图位置:80
格式:定长
类型:N10
描述:成功的查询交易次数。
系统软件在收到如下一个处理代码时会增加查询交易次数。
交易码交易服务
30查询可用金额

42,Bit81授权交易笔数(Authorization,Number)
位图位置:81
格式:定长
类型:N10
描述:成功的授权交易总额
在收到一个授权交易时系统将授权交易笔数加一。

43,Bit83贷记交易费金额(Credits,Transaction FeeAmount)
位图位置:83
格式:定长
类型:N12
描述:净交易费用,如交易金额为正。

44,Bit85借记交易费金额(Debits,Transaction FeeAmount)
位图位置:85
格式:定长
类型:N12
描述:净交易费用,如交易金额为负。

45,Bit86贷记交易金额(Credits,Amount)
位图位置:86
格式:定长
类型:N16
描述:贷记金融交易总的交易金额,不含任何费用。
系统在收到如下一个处理代码时会增加贷记交易金额,并在清算表报中反映。
交易码交易服务
20贷记,退货
21贷记,存款
22贷记,调整(客户修改)

46,Bit87贷记自动冲正金额(Credits,Reversal Amount)
位图位置:87
格式:定长
类型:N16
描述:信用卡自动冲正交易的总金额,不含任何费用。

47,Bit88借记交易金额(Debits,Amount)
位图位置:88
格式:定长
类型:N16
描述:借记金融交易总的交易金额,不含任何费用。
系统在收到如下一个处理代码时会增加借记交易金额,并在清算表报中反映。
交易码交易服务
00借记,购物与服务
01借记,取现
02借记,调整(客户调整)

48,Bit89借记自动冲正交易金额(Debits,Reversal Amount)
位图位置:89
格式:定长
类型:N16
描述:借记自动冲正交易的总金额,不含任何费用。

49,Bit90原交易的数据元素(Original Data Elements)
位图位置:90
格式:定长
类型:N42
描述:存放原交易的一些数据,用于修改或自动冲正。
数据由以下五部分组成:
位置描述
1-4信息类型码
设为原交易的信息类型代码
5-10系统跟踪号
原交易系统跟踪号
11-20交易日期和时间
原交易的交易日期和时间
21-31原收单机构
原交易的收单机构
不足11位的机构代码,左补‘0’
32-42原向前机构
原交易的收单机构
不足11位的机构代码,左补‘0’

50,Bit91文件修改编码(File Update Code)
位图位置:91
格式:定长
类型:AN1
描述:用此域指示某文件怎样维护。
CYBERBANK支持以下一些修改代码:
1增加记录
2改变记录
3删除记录
5查询
7增加文件

选用条件:

51,Bit94服务指示码(Service Indicator)
位图位置:94
格式:定长
类型:AN7
描述:指示文件修改服务。

选用条件:

52,Bit95代替金额(Replacement Amounts)
位图位置:95
格式:定长
类型:N42!!!
描述:客户修改或部分取消已完成的交易,最后实际发生的交易金额,
交易的原交易金额存放在90域。
本域由以下4部分组成
Sub-ElementAmountAttribute
交易实际金额N12
结算实际金额N12
实际交易费用X+N8
实际结算费用X+N8

53,Bit97净结算金额(Net Settlement Amount)
位图位置:97
格式:定长
类型:X+N16
描述:此域为净结帐金额。
502交易中用于发送当天的净结算金额
例:“C0000000020000000”,表示贷方('+'?)200000.00元。
“D0000000020000000”,表示借方('-'?)200000.00元。


54,Bit99结算机构码(Settlement Institution Identification)
位图位置:99
格式:LLVAR
类型:N..11
描述:此域存放接收清算信息的机构代码。
返回数据包此域必须和请求数据包一致。

55,Bit100接收机构码(Receiving Institution Identification)
位图位置:100
格式:LLVAR
类型:N..11
描述:金融交易此域存放授权机构代码。
网管类交易,800/820交易,此域存放请求的目的机构代码。
返回数据包此域必须和请求数据包一致。

56,Bit101文件名(FileName)
位图位置:101
格式:LLVAR
类型:ANS..17
描述:发送机构设置的文件名。

57,Bit102帐号1(Account Identification1)
位图位置:102
格式:LLVAR
类型:ANS..28
描述:一个特定的客户帐号。帐号1用来描述受借记、转出、支付等交易影响的帐户。
选用条件:转帐时使用。

58,Bit103帐号2(Account Identiication2)
位图位置:103
格式:LLVAR
类型:ANS..28
描述:交易的补充信息,如:第二货币号、利率代码、起止日期等。
定义如下表
0000000000000000000000000000000000000000000000000
位置长度描述
00-2122帐户
22-276发卡机构号

如果此域存在,将按此机构代码作为路由信息。
选用条件:机构间转帐时使用。


60,Bit123新密码数据(New PIN Data)
位图位置:123
格式:LLLVAR
类型:B...16
描述:修改密码交易时存放新密码。
格式参考52域
选用条件:修改密码交易时必须有此域。

61,Bit128信息确认码(MAC)
位图位置:128
格式:定长
类型:B16
描述:数据包的最后一个域,用于验证信息来源的合法性,以及数据包中数据是否未被篡改。
MAC的计算参ANSIX.99
为提高效率,在发送者和接收者之间,只有以下一些重要的域参加MAC的计算。数据包中如果存在以下数据域,它们将参加MAC的计算。

位图域名
2基本帐号
3处理代码
4交易金额
11系统跟踪号
12本地交易时间
13本地交易日期
32收单机构代码
38授权码
39返回码
41收单终端代码
49交易货币代码
95替换金额

选用条件:使用65-128数据域的数据包需使用此域。

源代码

下面是本人所写的关于iso8583协议的源代码,有不好的地方还请指出,以便完善:

(配合前面给的ASCII和BCD转化一起使用)

/*****************************iso8583.h******************************/

#ifndef _ISO8583_H
#define _ISO8583_H

#include <stdio.h>

#ifdef MY_DEBUG
#define MY_TRACE(x,args)  fprintf(stderr, x, args)
#else
#define MY_TRACE(x,args)
#endif

#define MY_BITGET(p,n)  ((p)[(n-1)/8]&(0x80>>((n-1)%8)))       //取bit位
#define MY_BITSET(p,n)  ((p)[(n-1)/8]|=(0x80>>((n-1)%8)))      //设bit位
#define MY_BITCLR(p,n)  ((p)[(n-1)/8]&=(~(0x80>>((n-1)%8))))   //清bit位


/*
 * ISO8583版本信息,不同版本,ISO_DEF变量g_isodef定义就不同,为0时自定义
 */
#define ISO8583_VERSION  0

/*
 * 数据域个数,正常标准为128,如有需要可以为64
 */
#define ISO_FLDS 64

#define TYP_BIT  0
#define TYP_BCD  1
#define TYP_ASC  2
#define TYP_BIN  3

#define FMT_FIXED 0
#define FMT_LLVAR 2
#define FMT_LLLVAR 3

/*
 * ISO定义域结构定义
 */
typedef struct tagISO_DEF {
 short typ;
 short fmt;
 int   len;
#if ISO8583_VERSION==93
 const char *dsc;
#endif
} ISO_DEF;

/*
 * ISO数据域结构定义
 */
typedef struct tagISO_MSG {
 struct tagISO_FLD {
  int len;
  unsigned char *buf;
 } fld[ISO_FLDS+1];
} ISO_MSG;

/*
 * 对ISO_MSG变量m进行初始化,最开始必须先调用此函数
 */
void iso8583_init(ISO_MSG *m);

/*
 * 设置ISO_MSG变量m中第idx位的值为data, data长度为len.
 */
int iso8583_set(ISO_MSG *m, int idx, const unsigned char *data, int len);

/*
 * 取得ISO_MSG变量m中第idx位的值到data, 希望最大长度为len.
 */
int iso8583_get(const ISO_MSG *m, int idx, unsigned char *data, int len);

/*
 * 把ISO_MSG变量m中数据按定义好的格式组包到buf中。
 */
int iso8583_pack(const ISO_MSG *m, char *buf);

/*
 * 把buf中数据按定义好的格式解包到ISO_MSG变量m中。
 */
int iso8583_unpack(ISO_MSG *m, const char *buf);

/*
 * 把ISO_MSG变量m中数据按定义好的格式保存到FILE中。
 */
void iso8583_dump(FILE *fp, ISO_MSG *m);

/*
 * 释放ISO_MSG变量m中数据及占用空间,unpack之前也需要free.
 */
void iso8583_free(ISO_MSG *m);

#endif /* iso8583.h */

/************************************iso8583.c******************************/

#include <stdlib.h>
#include <string.h>
#include "stdfunc.h"
#include "iso8583.h"

/*
 * 组包解包是否压缩数据,通常在POS中需压缩
 */
static int s_iCompress = 1;

static ISO_DEF s_isodef[] = {

#if ISO8583_VERSION==93

    /*000*/ {TYP_BCD, 0, 4, "Message Type Indicator"},
    /*001*/ {TYP_BIT, 0, 16, "Bitmap"},
    /*002*/ {TYP_BCD, 2, 19, "Primary Account number"},
    /*003*/ {TYP_BCD, 0, 6, "Processing Code"},
    /*004*/ {TYP_BCD, 0, 12, "Amount, Transaction"},
    /*005*/ {TYP_BCD, 0, 12, "Amount, Reconciliation"},
    /*006*/ {TYP_BCD, 0, 12, "Amount, Cardholder billing"},
    /*007*/ {TYP_BCD, 0, 10, "Date and time, transmission"},
    /*008*/ {TYP_BCD, 0, 8, "Amount, Cardholder billing fee"},
    /*009*/ {TYP_BCD, 0, 8, "Conversion rate, Reconciliation"},
    /*010*/ {TYP_BCD, 0, 8, "Conversion rate, Cardholder billing"},
    /*011*/ {TYP_BCD, 0, 6, "Systems trace audit number"},
    /*012*/ {TYP_BCD, 0, 12, "Date and time, Local transaction"},
    /*013*/ {TYP_BCD, 0, 4, "Date, Effective"},
    /*014*/ {TYP_BCD, 0, 4, "Date, Expiration"},
    /*015*/ {TYP_BCD, 0, 6, "Date, Settlement"},
    /*016*/ {TYP_BCD, 0, 4, "Date, Conversion"},
    /*017*/ {TYP_BCD, 0, 4, "Date, Capture"},
    /*018*/ {TYP_BCD, 0, 4, "Merchant type"},
    /*019*/ {TYP_BCD, 0, 3, "Country code, Acquiring institution"},
    /*020*/ {TYP_BCD, 0, 3, "Country code, Primary account number"},
    /*021*/ {TYP_BCD, 0, 3, "Country code, Forwarding institution"},
    /*022*/ {TYP_ASC, 0, 12, "Point of service data code"},
    /*023*/ {TYP_BCD, 0, 3, "Card sequence number"},
    /*024*/ {TYP_BCD, 0, 3, "Function code"},
    /*025*/ {TYP_BCD, 0, 4, "Message reason code"},
    /*026*/ {TYP_BCD, 0, 4, "Card acceptor business code"},
    /*027*/ {TYP_BCD, 0, 1, "Approval code length"},
    /*028*/ {TYP_BCD, 0, 6, "Date, Reconciliation"},
    /*029*/ {TYP_BCD, 0, 3, "Reconciliation indicator"},
    /*030*/ {TYP_BCD, 0, 24, "Amounts, original"},
    /*031*/ {TYP_ASC, 2, 99, "Acquirer reference data"},
    /*032*/ {TYP_BCD, 2, 11, "Acquirer institution identification code"},
    /*033*/ {TYP_BCD, 2, 11, "Forwarding institution identification code"},
    /*034*/ {TYP_ASC, 2, 28, "Primary account number, extended"},
    /*035*/ {TYP_ASC, 2, 37, "Track 2 data"},
    /*036*/ {TYP_ASC, 3, 104, "Track 3 data"},
    /*037*/ {TYP_ASC, 0, 12, "Retrieval reference number"},
    /*038*/ {TYP_ASC, 0, 6, "Approval code"},
    /*039*/ {TYP_BCD, 0, 3, "Action code"},
    /*040*/ {TYP_BCD, 0, 3, "Service code"},
    /*041*/ {TYP_ASC, 0, 8, "Card acceptor terminal identification"},
    /*042*/ {TYP_ASC, 0, 15, "Card acceptor identification code"},
    /*043*/ {TYP_ASC, 2, 99, "Card acceptor name/location"},
    /*044*/ {TYP_ASC, 2, 99, "Additional response data"},
    /*045*/ {TYP_ASC, 2, 76, "Track 1 data"},
    /*046*/ {TYP_ASC, 3, 204, "Amounts, Fees"},
    /*047*/ {TYP_ASC, 3, 999, "Additional data - national"},
    /*048*/ {TYP_ASC, 3, 999, "Additional data - private"},
    /*049*/ {TYP_ASC, 0, 3, "Currency code, Transaction"},
    /*050*/ {TYP_ASC, 0, 3, "Currency code, Reconciliation"},
    /*051*/ {TYP_ASC, 0, 3, "Currency code, Cardholder billing"},
    /*052*/ {TYP_BIN, 0, 8, "Personal identification number, PIN) data"},
    /*053*/ {TYP_BIN, 2, 48, "Security related control information"},
    /*054*/ {TYP_ASC, 3, 120, "Amounts, additional"},
    /*055*/ {TYP_BIN, 3, 255, "IC card system related data"},
    /*056*/ {TYP_BIN, 3, 255, "Original data elements"},
    /*057*/ {TYP_BCD, 0, 3, "Authorization life cycle code"},
    /*058*/ {TYP_BCD, 2, 11, "Authorizing agent institution Id Code"},
    /*059*/ {TYP_ASC, 3, 999, "Transport data"},
    /*060*/ {TYP_ASC, 3, 999, "Reserved for national use"},
    /*061*/ {TYP_ASC, 3, 999, "Reserved for national use"},
    /*062*/ {TYP_ASC, 3, 999, "Reserved for private use"},
    /*063*/ {TYP_ASC, 3, 999, "Reserved for private use"},
    /*064*/ {TYP_BIN, 0, 8, "Message authentication code field"}

#if ISO_FLDS==128 
 ,
 /*065*/ {TYP_BIN, 0, 8, "Reserved for ISO use"},
    /*066*/ {TYP_ASC, 3, 204, "Amounts, original fees"},
    /*067*/ {TYP_BCD, 0, 2, "Extended payment data"},
    /*068*/ {TYP_BCD, 0, 3, "Country code, receiving institution"},
    /*069*/ {TYP_BCD, 0, 3, "Country code, settlement institution"},
    /*070*/ {TYP_BCD, 0, 3, "Country code, authorizing agent Inst."},
    /*071*/ {TYP_BCD, 0, 8, "Message number"},
    /*072*/ {TYP_ASC, 3, 999, "Data record"},
    /*073*/ {TYP_BCD, 0, 6, "Date, action"},
    /*074*/ {TYP_BCD, 0, 10, "Credits, number"},
    /*075*/ {TYP_BCD, 0, 10, "Credits, reversal number"},
    /*076*/ {TYP_BCD, 0, 10, "Debits, number"},
    /*077*/ {TYP_BCD, 0, 10, "Debits, reversal number"},
    /*078*/ {TYP_BCD, 0, 10, "Transfer, number"},
    /*079*/ {TYP_BCD, 0, 10, "Transfer, reversal number"},
    /*080*/ {TYP_BCD, 0, 10, "Inquiries, number"},
    /*081*/ {TYP_BCD, 0, 10, "Authorizations, number"},
    /*082*/ {TYP_BCD, 0, 10, "Inquiries, reversal number"},
    /*083*/ {TYP_BCD, 0, 10, "Payments, number"},
    /*084*/ {TYP_BCD, 0, 10, "Payments, reversal number"},
    /*085*/ {TYP_BCD, 0, 10, "Fee collections, number"},
    /*086*/ {TYP_BCD, 0, 16, "Credits, amount"},
    /*087*/ {TYP_BCD, 0, 16, "Credits, reversal amount"},
    /*088*/ {TYP_BCD, 0, 16, "Debits, amount"},
    /*089*/ {TYP_BCD, 0, 16, "Debits, reversal amount"},
    /*090*/ {TYP_BCD, 0, 10, "Authorizations, reversal number"},
    /*091*/ {TYP_BCD, 0, 3, "Country code, transaction Dest. Inst."},
    /*092*/ {TYP_BCD, 0, 3, "Country code, transaction Orig. Inst."},
    /*093*/ {TYP_BCD, 2, 11, "Transaction Dest. Inst. Id code"},
    /*094*/ {TYP_BCD, 2, 11, "Transaction Orig. Inst. Id code"},
    /*095*/ {TYP_ASC, 2, 99, "Card issuer reference data"},
    /*096*/ {TYP_BIN, 3, 999, "Key management data"},
    /*097*/ {TYP_BCD, 0, 1+16, "Amount, Net reconciliation"}, /* was ISO_AMOUNT */
    /*098*/ {TYP_ASC, 0, 25, "Payee"},
    /*099*/ {TYP_ASC, 2, 11, "Settlement institution Id code"},
    /*100*/ {TYP_BCD, 2, 11, "Receiving institution Id code"},
    /*101*/ {TYP_ASC, 2, 17, "File name"},
    /*102*/ {TYP_ASC, 2, 28, "Account identification 1"},
    /*103*/ {TYP_ASC, 2, 28, "Account identification 2"},
    /*104*/ {TYP_ASC, 3, 100, "Transaction description"},
    /*105*/ {TYP_BCD, 0, 16, "Credits, Chargeback amount"},
    /*106*/ {TYP_BCD, 0, 16, "Debits, Chargeback amount"},
    /*107*/ {TYP_BCD, 0, 10, "Credits, Chargeback number"},
    /*108*/ {TYP_BCD, 0, 10, "Debits, Chargeback number"},
    /*109*/ {TYP_ASC, 2, 84, "Credits, Fee amounts"},
    /*110*/ {TYP_ASC, 2, 84, "Debits, Fee amounts"},
    /*111*/ {TYP_ASC, 3, 999, "Reserved for ISO use"},
    /*112*/ {TYP_ASC, 3, 999, "Reserved for ISO use"},
    /*113*/ {TYP_ASC, 3, 999, "Reserved for ISO use"},
    /*114*/ {TYP_ASC, 3, 999, "Reserved for ISO use"},
    /*115*/ {TYP_ASC, 3, 999, "Reserved for ISO use"},
    /*116*/ {TYP_ASC, 3, 999, "Reserved for national use"},
    /*117*/ {TYP_ASC, 3, 999, "Reserved for national use"},
    /*118*/ {TYP_ASC, 3, 999, "Reserved for national use"},
    /*119*/ {TYP_ASC, 3, 999, "Reserved for national use"},
    /*120*/ {TYP_ASC, 3, 999, "Reserved for national use"},
    /*121*/ {TYP_ASC, 3, 999, "Reserved for national use"},
    /*122*/ {TYP_ASC, 3, 999, "Reserved for national use"},
    /*123*/ {TYP_ASC, 3, 999, "Reserved for private use"},
    /*124*/ {TYP_ASC, 3, 999, "Reserved for private use"},
    /*125*/ {TYP_ASC, 3, 999, "Reserved for private use"},
    /*126*/ {TYP_ASC, 3, 999, "Reserved for private use"},
    /*127*/ {TYP_ASC, 3, 999, "Reserved for private use"},
    /*128*/ {TYP_BIN, 0, 8, "Message authentication code field"}
#endif /*ISO_FLDS==128*/

#else /*ISO8583_VERSION*/

    /*000*/ {TYP_BCD, 0, 4}, // "Message Type Indicator"
    /*001*/ {TYP_BIT, 0, 16}, // "Bitmap"
    /*002*/ {TYP_BCD, 2, 22}, // "Primary Account number"
    /*003*/ {TYP_BCD, 0, 6}, // "Processing Code"
    /*004*/ {TYP_BCD, 0, 12}, // "Amount, Transaction"
    /*005*/ {TYP_BCD, 0, 12}, // "Amount, Reconciliation"
    /*006*/ {TYP_BCD, 0, 12}, // "Amount, Cardholder billing"
    /*007*/ {TYP_BCD, 0, 10}, // "Date and time, transmission"
    /*008*/ {TYP_BCD, 0, 8}, // "Amount, Cardholder billing fee"
    /*009*/ {TYP_BCD, 0, 8}, // "Conversion rate, Reconciliation"
    /*010*/ {TYP_BCD, 0, 8}, // "Conversion rate, Cardholder billing"
    /*011*/ {TYP_BCD, 0, 6}, // "Systems trace audit number"
    /*012*/ {TYP_BCD, 0, 12}, // "Date and time, Local transaction"
    /*013*/ {TYP_BCD, 0, 4}, // "Date, Effective"
    /*014*/ {TYP_BCD, 0, 4}, // "Date, Expiration"
    /*015*/ {TYP_BCD, 0, 6}, // "Date, Settlement"
    /*016*/ {TYP_BCD, 0, 4}, // "Date, Conversion"
    /*017*/ {TYP_BCD, 0, 4}, // "Date, Capture"
    /*018*/ {TYP_BCD, 0, 4}, // "Merchant type"
    /*019*/ {TYP_BCD, 0, 3}, // "Country code, Acquiring institution"
    /*020*/ {TYP_BCD, 0, 3}, // "Country code, Primary account number"
    /*021*/ {TYP_BCD, 0, 3}, // "Country code, Forwarding institution"
    /*022*/ {TYP_ASC, 0, 12}, // "Point of service data code"
    /*023*/ {TYP_BCD, 0, 3}, // "Card sequence number"
    /*024*/ {TYP_BCD, 0, 3}, // "Function code"
    /*025*/ {TYP_BCD, 0, 4}, // "Message reason code"
    /*026*/ {TYP_BCD, 0, 4}, // "Card acceptor business code"
    /*027*/ {TYP_BCD, 0, 1}, // "Approval code length"
    /*028*/ {TYP_BCD, 0, 6}, // "Date, Reconciliation"
    /*029*/ {TYP_BCD, 0, 3}, // "Reconciliation indicator"
    /*030*/ {TYP_BCD, 0, 24}, // "Amounts, original"
    /*031*/ {TYP_ASC, 2, 99}, // "Acquirer reference data"
    /*032*/ {TYP_BCD, 2, 11}, // "Acquirer institution identification code"
    /*033*/ {TYP_BCD, 2, 11}, // "Forwarding institution identification code"
    /*034*/ {TYP_ASC, 2, 28}, // "Primary account number, extended"
    /*035*/ {TYP_ASC, 2, 37}, // "Track 2 data"
    /*036*/ {TYP_ASC, 3, 104}, // "Track 3 data"
    /*037*/ {TYP_ASC, 0, 12}, // "Retrieval reference number"
    /*038*/ {TYP_ASC, 0, 6}, // "Approval code"
    /*039*/ {TYP_BCD, 0, 3}, // "Action code"
    /*040*/ {TYP_BCD, 0, 3}, // "Service code"
    /*041*/ {TYP_ASC, 0, 8}, // "Card acceptor terminal identification"
    /*042*/ {TYP_ASC, 0, 15}, // "Card acceptor identification code"
    /*043*/ {TYP_ASC, 2, 99}, // "Card acceptor name/location"
    /*044*/ {TYP_ASC, 2, 99}, // "Additional response data"
    /*045*/ {TYP_ASC, 2, 76}, // "Track 1 data"
    /*046*/ {TYP_ASC, 3, 204}, // "Amounts, Fees"
    /*047*/ {TYP_ASC, 3, 999}, // "Additional data - national"
    /*048*/ {TYP_ASC, 3, 999}, // "Additional data - private"
    /*049*/ {TYP_ASC, 0, 3}, // "Currency code, Transaction"
    /*050*/ {TYP_ASC, 0, 3}, // "Currency code, Reconciliation"
    /*051*/ {TYP_ASC, 0, 3}, // "Currency code, Cardholder billing"
    /*052*/ {TYP_BIN, 0, 8}, // "Personal identification number, PIN) data"
    /*053*/ {TYP_BIN, 2, 48}, // "Security related control information"
    /*054*/ {TYP_ASC, 3, 120}, // "Amounts, additional"
    /*055*/ {TYP_BIN, 3, 255}, // "IC card system related data"
    /*056*/ {TYP_BIN, 3, 255}, // "Original data elements"
    /*057*/ {TYP_BCD, 0, 3}, // "Authorization life cycle code"
    /*058*/ {TYP_BCD, 2, 11}, // "Authorizing agent institution Id Code"
    /*059*/ {TYP_ASC, 3, 999}, // "Transport data"
    /*060*/ {TYP_ASC, 3, 999}, // "Reserved for national use"
    /*061*/ {TYP_ASC, 3, 999}, // "Reserved for national use"
    /*062*/ {TYP_ASC, 3, 999}, // "Reserved for private use"
    /*063*/ {TYP_ASC, 3, 999}, // "Reserved for private use"
    /*064*/ {TYP_BIN, 0, 8}  // "Message authentication code field"

#if ISO_FLDS==128
 ,
 /*065*/ {TYP_BIN, 0, 8}, // "Reserved for ISO use"
    /*066*/ {TYP_ASC, 3, 204}, // "Amounts, original fees"
    /*067*/ {TYP_BCD, 0, 2}, // "Extended payment data"
    /*068*/ {TYP_BCD, 0, 3}, // "Country code, receiving institution"
    /*069*/ {TYP_BCD, 0, 3}, // "Country code, settlement institution"
    /*070*/ {TYP_BCD, 0, 3}, // "Country code, authorizing agent Inst."
    /*071*/ {TYP_BCD, 0, 8}, // "Message number"
    /*072*/ {TYP_ASC, 3, 999}, // "Data record"
    /*073*/ {TYP_BCD, 0, 6}, // "Date, action"
    /*074*/ {TYP_BCD, 0, 10}, // "Credits, number"
    /*075*/ {TYP_BCD, 0, 10}, // "Credits, reversal number"
    /*076*/ {TYP_BCD, 0, 10}, // "Debits, number"
    /*077*/ {TYP_BCD, 0, 10}, // "Debits, reversal number"
    /*078*/ {TYP_BCD, 0, 10}, // "Transfer, number"
    /*079*/ {TYP_BCD, 0, 10}, // "Transfer, reversal number"
    /*080*/ {TYP_BCD, 0, 10}, // "Inquiries, number"
    /*081*/ {TYP_BCD, 0, 10}, // "Authorizations, number"
    /*082*/ {TYP_BCD, 0, 10}, // "Inquiries, reversal number"
    /*083*/ {TYP_BCD, 0, 10}, // "Payments, number"
    /*084*/ {TYP_BCD, 0, 10}, // "Payments, reversal number"
    /*085*/ {TYP_BCD, 0, 10}, // "Fee collections, number"
    /*086*/ {TYP_BCD, 0, 16}, // "Credits, amount"
    /*087*/ {TYP_BCD, 0, 16}, // "Credits, reversal amount"
    /*088*/ {TYP_BCD, 0, 16}, // "Debits, amount"
    /*089*/ {TYP_BCD, 0, 16}, // "Debits, reversal amount"
    /*090*/ {TYP_BCD, 0, 10}, // "Authorizations, reversal number"
    /*091*/ {TYP_BCD, 0, 3}, // "Country code, transaction Dest. Inst."
    /*092*/ {TYP_BCD, 0, 3}, // "Country code, transaction Orig. Inst."
    /*093*/ {TYP_BCD, 2, 11}, // "Transaction Dest. Inst. Id code"
    /*094*/ {TYP_BCD, 2, 11}, // "Transaction Orig. Inst. Id code"
    /*095*/ {TYP_ASC, 2, 99}, // "Card issuer reference data"
    /*096*/ {TYP_BIN, 3, 999}, // "Key management data"
    /*097*/ {TYP_BCD, 0, 1+16}, // "Amount, Net reconciliation"/* was ISO_AMOUNT */
    /*098*/ {TYP_ASC, 0, 25}, // "Payee"
    /*099*/ {TYP_ASC, 2, 11}, // "Settlement institution Id code"
    /*100*/ {TYP_BCD, 2, 11}, // "Receiving institution Id code"
    /*101*/ {TYP_ASC, 2, 17}, // "File name"
    /*102*/ {TYP_ASC, 2, 28}, // "Account identification 1"
    /*103*/ {TYP_ASC, 2, 28}, // "Account identification 2"
    /*104*/ {TYP_ASC, 3, 100}, // "Transaction description"
    /*105*/ {TYP_BCD, 0, 16}, // "Credits, Chargeback amount"
    /*106*/ {TYP_BCD, 0, 16}, // "Debits, Chargeback amount"
    /*107*/ {TYP_BCD, 0, 10}, // "Credits, Chargeback number"
    /*108*/ {TYP_BCD, 0, 10}, // "Debits, Chargeback number"
    /*109*/ {TYP_ASC, 2, 84}, // "Credits, Fee amounts"
    /*110*/ {TYP_ASC, 2, 84}, // "Debits, Fee amounts"
    /*111*/ {TYP_ASC, 3, 999}, // "Reserved for ISO use"
    /*112*/ {TYP_ASC, 3, 999}, // "Reserved for ISO use"
    /*113*/ {TYP_ASC, 3, 999}, // "Reserved for ISO use"
    /*114*/ {TYP_ASC, 3, 999}, // "Reserved for ISO use"
    /*115*/ {TYP_ASC, 3, 999}, // "Reserved for ISO use"
    /*116*/ {TYP_ASC, 3, 999}, // "Reserved for national use"
    /*117*/ {TYP_ASC, 3, 999}, // "Reserved for national use"
    /*118*/ {TYP_ASC, 3, 999}, // "Reserved for national use"
    /*119*/ {TYP_ASC, 3, 999}, // "Reserved for national use"
    /*120*/ {TYP_ASC, 3, 999}, // "Reserved for national use"
    /*121*/ {TYP_ASC, 3, 999}, // "Reserved for national use"
    /*122*/ {TYP_ASC, 3, 999}, // "Reserved for national use"
    /*123*/ {TYP_ASC, 3, 999}, // "Reserved for private use"
    /*124*/ {TYP_ASC, 3, 999}, // "Reserved for private use"
    /*125*/ {TYP_ASC, 3, 999}, // "Reserved for private use"
    /*126*/ {TYP_ASC, 3, 999}, // "Reserved for private use"
    /*127*/ {TYP_ASC, 3, 999}, // "Reserved for private use"
    /*128*/ {TYP_BIN, 0, 8}  // "Message authentication code field"

#endif /*ISO_FLDS==128*/

#endif /*ISO8583_VERSION*/
};


void iso8583_compress(int c)
{
 s_iCompress = c;
}

/* Initialize an ISO message struct - i.e. set all entries to NULL */
void iso8583_init(ISO_MSG *m)
{
 int i;

 for (i=0; i<=ISO_FLDS; i++) {
  m->fld[i].buf = NULL;
  m->fld[i].len = 0;
 }
}

int iso8583_set(ISO_MSG *m, int idx, const unsigned char *data, int len)
{
 if (m->fld[idx].buf != NULL) {
  free(m->fld[idx].buf);
  m->fld[idx].buf = NULL;
  m->fld[idx].len = 0;
 }

 if (len > s_isodef[idx].len)
  return 0;
 
 m->fld[idx].len = len;
 m->fld[idx].buf = (unsigned char*)malloc(m->fld[idx].len * sizeof(char));
 if (m->fld[idx].buf == NULL)
  return 0;

 memcpy(m->fld[idx].buf, data, m->fld[idx].len);

 return len;
}

int iso8583_get(const ISO_MSG *m, int idx, unsigned char *data, int len)
{
 if (m == NULL || data == NULL || m->fld[idx].buf == NULL)
  return 0;
 
 if (m->fld[idx].len > len)
  return 0;
  
 memcpy(data, m->fld[idx].buf, m->fld[idx].len);
 
 return m->fld[idx].len;
}


/*
 * Using the definition d, pack the content of the ISO message m into
 * buf. NOTE: buf must be large enough to contain the packed message.
 * Returns the length of the data written to buf.
 */
int iso8583_pack(const ISO_MSG *m, char *buf)
{
 char *start = buf;
 int flds, i;
 char fmt[8], tmp[8]={0};

 /* Field 0 is mandatory and fixed length. */
 if (m->fld[0].len != s_isodef[0].len || s_isodef[0].fmt != FMT_FIXED) {
  MY_TRACE("flds = %d", 0);
  return -1;
 }

 if (s_iCompress)
 {
  buf += ASC2BCD(buf, m->fld[0].buf, s_isodef[0].len, s_isodef[0].fmt);
 }
 else
 {
  memcpy(buf, m->fld[0].buf, s_isodef[0].len);
  buf += s_isodef[0].len;  
 }

 /*
  * The bitmap contains either 64 or 128 fields - flds is the
  * number of allowed fields, i.e. either 64 or 128.
  */
 if (m->fld[1].buf == NULL || s_isodef[1].len != 16) {
  MY_TRACE("flds = %d", 1);
  return -1;
 }
 
#if ISO_FLDS==128
 if ((m->fld[1].len == s_isodef[1].len) && (m->fld[1].buf[0] & 0x80))
 {
  memcpy(buf, m->fld[1].buf, s_isodef[0].len);
  buf += s_isodef[1].len;
  flds = 128;
 }
 else
 {
  if ((m->fld[1].len == 8) && !(m->fld[1].buf[0] & 0x80))
  {
   memcpy(buf, m->fld[1].buf, 8);
   buf += 8;
   flds = 64;
  }
  else
  {
   MY_TRACE("flds = %d", 1);
   return -1;
  }
 }
#else /*ISO_FLDS==128*/
 if ((m->fld[1].len != 8) || (m->fld[1].buf[0] & 0x80)) {
  MY_TRACE("flds = %d", 1);
  return -1;
 }
 
 memcpy(buf, m->fld[1].buf, m->fld[1].len);
 buf += m->fld[1].len;
 flds = 64;
#endif /*ISO_FLDS==128*/

 for (i = 2; i <= flds; i++)
 {
  if (MY_BITGET(m->fld[1].buf, i))
  { /* i'th bit != 0 */
   if (m->fld[i].buf == NULL || m->fld[i].len <= 0 || m->fld[i].len > s_isodef[i].len)
   {
    MY_TRACE("flds = %d", i);
    return -1;
   }

   if (s_isodef[i].fmt)
   { /* Variable length */
    if (s_iCompress)
    {
     sprintf(fmt, "%%0%dd", s_isodef[i].fmt);
     sprintf(tmp, fmt, m->fld[i].len);
     buf += ASC2BCD(buf, tmp, s_isodef[i].fmt, 0);
    }
    else
    {
     sprintf(fmt, "%%0%dd", s_isodef[i].fmt);
     sprintf(buf, fmt, m->fld[i].len);
     buf += s_isodef[i].fmt;
    }   
   }

   switch (s_isodef[i].typ) {
   case TYP_BCD: /* Fallthrough */
    if (s_iCompress)
    {
     buf += ASC2BCD(buf, m->fld[i].buf, m->fld[i].len, s_isodef[i].fmt);
     break;
    }
   case TYP_ASC:
   case TYP_BIN:
    memcpy(buf, m->fld[i].buf, m->fld[i].len);
    buf += m->fld[i].len;
    break;
   default:
    MY_TRACE("flds = %d", i);
    return -1;
    break;
   }
     }
 }

 return (buf-start);
}


/*
 * Using the definition d, unpack the content of buf into the ISO
 * message struct m.
 * Returns 0. FIXME: Should be something different.
 */
int iso8583_unpack(ISO_MSG *m, const char *buf)
{
 const char *start = buf;
 int flds, i;
    char fmt[8];

 memset(fmt, 0, sizeof(fmt));

 /* Field 0 is mandatory and fixed length. */
 if (m->fld[0].buf != NULL || s_isodef[0].fmt != FMT_FIXED) {
  MY_TRACE("flds = %d", 0);
  return -1;
 }

 m->fld[0].len = s_isodef[0].len;
 m->fld[0].buf = (char *) malloc((m->fld[0].len) * sizeof(char));
 if(s_iCompress)
 {
  buf += BCD2ASC(m->fld[0].buf, buf, m->fld[0].len, s_isodef[0].fmt);
 }
 else
 {
  memcpy(m->fld[0].buf, buf, m->fld[0].len);
  buf += m->fld[0].len;
 }


 /*
  * First bit in the bitmap (field 1) defines if the message is
  * extended or not.
  * 0: not exteded - i.e. only (some of) the fields 0 to 64 are
  *    used
  * 1: extended - i.e. (some of) the fields 0 to 128 are used
  * I.e. if one or more of the fields 65 to 128 is used, the
  * bit is 1.
  */
#if ISO_FLDS==128
 if(buf[0] & 0x80) {
  flds = 128;
 } else {
  flds = 64;
 }
#else /*ISO_FLDS==128*/
 if(buf[0] & 0x80) {
  MY_TRACE("flds = %d", 1);
  return -1;
 }
 flds = 64;
#endif /*ISO_FLDS==128*/

 m->fld[1].len = flds/8;
 m->fld[1].buf = (char *) calloc((m->fld[1].len), sizeof(char));
 memcpy(m->fld[1].buf, buf, m->fld[1].len);
 buf += m->fld[1].len;

 for (i = 2; i <= flds; i++)
 {
  if (MY_BITGET(m-&

分享到:
评论

相关推荐

    全同态加密代码

    通过分析和理解这些源代码,开发者不仅可以深入学习全同态加密的原理,还能了解如何在实际中应用这些理论。 然而,FHE目前仍然面临着效率低下的挑战,因为它的计算复杂度较高。因此,IBM的代码可能包含了各种优化...

    base zz zz zz zz

    base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz

    VC++编译器源代码

    VC++编译器是C++程序员的重要工具,它将程序员编写的源代码转换成可执行文件,使得计算机能够理解和执行。 【描述】中的“值得学习一下,哈哈”提示我们,这份源代码可能包含了许多关于编译原理、优化技巧以及与...

    八数码问题的源代码

    在提供的压缩包文件中,虽然没有直接的源代码文件,但"八数码问题的源代码"可能是包含这些功能的源代码文件。其他文件如"站长265源码下载.html"和"zz265.com.txt"可能是指提供源码下载的网站信息,而"重要说明.txt...

    JAVA源码Java火影忍者游戏源代码

    需要注意的是,在下载和使用他人分享的源代码时,应当确保其来源合法,并且尊重原作者的版权。如果涉及到商业用途,还需要考虑是否需要获得授权或许可。 #### 源代码分析 - **代码结构**:通常,一个Java游戏项目...

    XILINXFPGA源码USB2.0IP核源代码

    XILINXFPGA源码USB2.0 IP核源代码提取方式是百度网盘分享地址

    XviD源代码

    在本文中,我们将探讨XviD源代码的核心概念,以及如何利用这些源代码进行学习和开发。 一、XviD编码技术概述 XviD基于MPEG-4 Part 2标准,这是一种高效且广泛使用的视频压缩格式。XviD的主要目标是提供高质量的...

    java源代码

    Java源代码是编程学习的重要组成部分,它展示了程序的逻辑结构和实现细节,是理解Java语言原理和编程思想的关键。这份压缩包包含了一系列的Java源文件,涵盖了从初级到中级的编程知识,对于初学者和有一定基础的学习...

    新安江模型程序核心源代码_新安江模型_XinanjiangMODEL_XinJiang_

    “新安江模型程序核心源代码.docx”这个文档可能包含了模型的详细算法描述、源代码结构解析、使用指南和示例应用等内容,对于学习和应用新安江模型的人来说是宝贵的参考资料。通过阅读和理解这个文档,可以更深入地...

    uC/OS-II 源代码

    在深入探讨其源代码之前,我们需要了解uC/OS-II的基本结构和特性。 首先,uC/OS-II的核心是任务管理。它支持多任务并行执行,每个任务都有自己的堆栈和优先级。通过任务调度器,系统能够根据优先级自动切换任务,...

    android应用源码zz-doctor中医大夫助理信息系统.rar

    【标题】"android应用源码zz-doctor中医大夫助理信息系统.rar"揭示了这是一份针对Android平台开发的应用程序源代码,专门设计用于辅助中医大夫进行日常工作。这个系统可能集成了病症诊断、处方建议、病例记录等多种...

    C++OpenCV3源代码漫水填充算法

    用户需要使用C++编译器来编译和运行这些源代码,这可能还需要OpenCV3库的支持。 综上所述,从这个文件信息中可以提取的知识点包括: 1. C++编程语言在软件开发中的应用,尤其是与计算机视觉库OpenCV3结合时。 2. ...

    JAVA源码Java赌神游戏网络版源代码

    阅读和理解 Java 源代码是一项基本技能,对于学习和改进游戏具有重要意义。以下是一些推荐的步骤: - **熟悉 Java 语法**:确保对 Java 的基本语法有足够了解。 - **分析类结构**:识别出不同类之间的关系及其职责。...

    matlab算法源码MATLAB7教程源代码

    下载后,用户可以得到一个包含教程和源代码的文件包。资源包可能被压缩存储,需要解压后才能使用。使用这些资源时,需要有MATLAB的相应版本安装在计算机上,然后将源代码导入MATLAB环境中运行。 总结而言,该资源...

    zz CAD快速计算长度插件

    在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。

    JavaEE程序设计与应用开发源代码.rar

    7. **JNDI(Java Naming and Directory Interface)**:JNDI提供了一个命名和目录服务,用于查找和管理JavaEE应用中的资源,如数据源、邮件服务器等。 8. **JTA(Java Transaction API)**:JTA定义了跨多个资源的...

    zz809.com留言本

    源代码的分享是IT领域中常见的学习和交流方式,本资源作为“源代码”和“源码”,对于开发者来说具有很高的研究价值。它不仅可以让开发者了解留言本系统的内部运行机制,还能为他们提供一个实战性的学习案例,以便于...

    C++OpenCV3源代码分水岭算法

    同时,也提供了获取源代码的方式和路径,便于有兴趣的开发者进一步学习和应用。由于资源分享的链接并未完全展示,需要自行访问百度网盘进行验证和下载。在此,提醒用户注意网络安全和个人隐私保护,在获取和使用资源...

    zz_layer.rar

    zz_layer.il是源代码,install.bat是安装的 使用举例:zz 1-3 4 126 127 层号定义,与PADS类似:1~120是etch ;SolderMask: 121(top) 128(bot) ;Silkscreen: 126(top) 129(bot) ;Assembly: 127(top) 130(bot) ;Paste...

    数据库打印预览源代码

    本文将详细解析如何利用VB2010实现数据库打印预览源代码,以及涉及到的相关知识点。 首先,我们需要理解数据库的基本概念。数据库是一种组织和存储数据的系统,它能够提供数据的检索、更新和管理。在VB2010中,我们...

Global site tag (gtag.js) - Google Analytics