[精彩] 8583问题
www.chinaunix 作者:lcunix  发表于:2006-02-19 00:03:51
发表评论】【查看原文】【C/C++讨论区】【关闭

各位高手能否详细的解释一下8583协议
 htldm 回复于:2003-08-31 22:15:18

ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。8583包前面一段为位图,用来确定包的字段域组成情况。 
其中位图是8583包的灵魂,它是打包解包确定字段域的关键, 而了解每个字段域的属性则是填写数据的基础, 
1 位图描述如下: 
位图位置:
格式:定长 
类型:B16(二进制16位,16*8=128bit 
描述: 
如将位图的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。 
如使用某数据域,应在位图中将相应的位设位'1',如使用41域,需将位图的41位设为'1' 
选用条件:如使用65128域,需设位图域第一位为'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:否 22位变长
33位变长*/ 
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}, 
/* 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位。 
A:ISO8583各域段的说明 
1,信息类型(message type)定义 
位图位置:- 
格式:定长 
类型:N4 
描述: 
数据包的第一部分,定义数据包的类型。 
数据类型由数据包的发起者设定,应遵循以下要求: 
数据包开始部分必须是信息类型; 
对不支持的信息类型能给出拒绝应答。 
0100授权交易 
0110授权交易答复 
0200金融交易 
0210金融交易答复 
0240查询交易 
0250查询交易答复 
0400冲正交易 
0410冲正交易答复 
0800管理交易 
0810管理交易答复 

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

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

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


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



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

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

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

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

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

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

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

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

13Bit18商户类型(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各类专业服务:会计、教育、装修、工程 

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


34Bit70管理信息码(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) 

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

选用条件: 

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

选用条件: 

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

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


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

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

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

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

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

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


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

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

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

选用条件:使用65128数据域的数据包需使用此域。 






typedefstruct 

longsync_counter; 
charkeytype; 
} AB8583_Security_Ctrl_Info; 
typedef struct 

charlength[4]; 
struct 

characcount_type[3]; 
charamount_type[3]; 
charcurrency_code[4]; 
doubleamount; 
} ledger_balance_amount; 
struct 

characcount_type[3]; 
charamount_type[3]; 
charcurrency_code[4]; 
doubleamount; 
} available_balance_amount; 
} AB8583_Balance_Amount; 
typedef struct 

charencryption_key_used; 
charmac_key_used; 
charmessage_effect; 
charno_of_unlogged_txns; 
} AB8583_Message_Indicator; 
typedef struct 

charauth_function_code; 
charauth_mode; 
charauth_id_response_code[7]; 
charservice_business_code[5]; 
charinvoice_number[11]; 
} AB8583_Auth_Operation_Code; 
typedef struct 

charorg_message_type[5]; 
charorg_system_trace_number[7]; 
charorg_transaction_date_time[11]; 
charorg_acqr_inst_id_code[12]; 
charora_forw_inst_id_code[12]; 
} AB8583_Original_Data_Elements; 
typedef struct 

doubleactual_amount_of_transaction; 
doubleactual_amount_of_settlement; 
doubleactual_amount_of_transaction_fee; 
doubleactual_amount_of_settlement_fee; 
} AB8583_Replacement_Amounts; 
BIT DATA_NAME TYPE 
typedef struct 

charmessage_type[5]; 
/*** 
MESSAGE_TYPE_IDENTIFICATION N4 
0100 授权类请求消息(授权,撤消授权,余额查询
0110 授权类应答消息(授权,撤消授权,余额查询
0200 金融类请求消息(取款,存款,消费,退款
0210 金融类应答消息(取款,存款,消费,退款
0420 冲正类报告消息(取款,存款,消费,退款,授权
0430 冲正类应答消息(取款,存款,消费,退款,授权
0524 对帐类报告消息(ATM结算对帐,POS结算对帐
0534 对帐类应答消息(ATM结算对帐,POS结算对帐
0800 网络业务管理类请求消息(重置密钥
0810 网络业务管理类应答消息(重置密钥
0820 网络业务管理类报告消息(状态设置,广播通知,申请重置密钥
0830 网络业务管理类应答消息(状态设置,广播通知,申请重置密钥
****/ 
charprimary_account_number[20]; 
/**** 
2 PRIMARY_ACCOUNT_NUMBER&19(LLVAR) 
charprocessing_code[7]; 
3 PROCESSING_CODE N6 
doubleamount_of_transactions; 
4 AMOUNT_OF_TRANSACTIONS N12 
doubleamount_of_settlement; 
5 AMOUNT_OF_SETTLEMENT N12 
chartransmission_date_and_time[11]; 
7 TRANSMISSION_DATE_AND_TIME N10 
longsystem_trace_audit_number; 
11 SYSTEM_TRACE_AUDIT_NUMBER N6 
chartime_of_local_transaction[7]; 
12 TIME_OF_LOCAL_TRANSACTION N6 
chardate_of_local_transaction[5]; 
13 DATE_OF_LOCAL_TRANSACTION N4 
chardate_of_settlement[5]; 
15 DATE_OF_SETTLEMENT N4 
chardate_of_capture[5]; 
17 DATE_OF_CAPTURE N4 
charbusiness_type[4]; 
18 BUSINESS_TYPE AN3 
charpoint_of_service_entry_mode[4]; 
22 POINT_OF_SERVICE_ENTRY_MODE N3 
charpoint_of_service_PIN_capture_code[3]; 
26 POINT_OF_SERVICE_PIN_CAPTURE_CODE N2 
doublefee_of_transaction; 
28 FEE_OF_TRANSACTION N8 
doublefee_of_settlement; 
29 FEE_OF_SETTLEMENT X+N8 
characquiring_institution_id_code[12]; 
32 ACQUIRING_INSTITUTION_IDENTIFICATION_CODE N..11(LLVAR) 
charforwarding_institution_id_code[12]; 
33 FORWARDING_INSTITUTION_IDENTIFICATION_CODE N..11(LLVAR) 
chartrack_2_data[38]; 
35 TRACK_2_DATA&37(LLVAR) 
chartrack_3_data[105]; 
36 TRACK_3_DATA&104(LLLVAR) 
longretrieval_reference_number; 
37 RETRIEVAL_REFERENCE_NUMBER AN12 
charauth_id_response[7]; 
38 AUTHORIZATION_IDENTIFICATION_RESPONSE AN6 
charresponse_code[3]; 
39 RESPONSE_CODE AN2 
charcard_acceptor_terminal_id[9]; 
41 CARD_ACCEPTOR_TERMINAL_IDENTIFICATION ANS8 
前两位的定义如下
51 ATM终端 
52 银行POS 
53 商户POS 
charcard_acceptor_id_code[16]; 
42 CARD_ACCEPTOR_IDENTIFICATION_CODE ANS15 
charcard_acceptor_name_location[41]; 
43 CARD_ACCEPTOR_NAME_LOCATION ANS40 
charadditional_response_data[26]; 
44 ADDITIONAL_RESPONSE_DATA ANS..25(LLVAR) 
charbroadcasted_message[1000]; 
48 BROADCASTED_MESSAGE&999 
charcurrency_code_of_transaction[4]; 
49 CURRENCY_CODE_OF_TRANSACTION AN3 
charcurrency_code_of_settlement[4]; 
50 CURRENCY_CODE_OF_SETTLEMENT AN3 
charPIN[8]; 
52 PIN_DATA B64 
AB8583_Security_Ctrl_Infosecurity_ctrl_info; 
53 SECURITY_RELATED_CONTROL_INformATION N16 
SYNC_COUNTER N8 
密钥同步计数器 
RESERVED N7 
KEY_TYPE N1 
用于交换中心和成员行机构之间的PIN加密解密 
用于交换中心和成员行机构之间的MAC计算 
用于成员行和终端之间的PIN加密解密 
AB8583_Balance_Amountbalance_amount; 
54 BALANCE_AMOUNT AN43 
LENGTH N3(040) 
LEDGER_BALANCE_AMOUNT 
ACCOUNT_TYPE N2(CC=30,SC=10) 
AMOUNT_TYPE N2(01) 
CURRENCY_CODE AN3(156) 
AMOUNT X+N12 
AVAILABLE_BALANCE_AMOUNT 
ACCOUNT_TYPE N2(CC=30,SC=10) 
AMOUNT_TYPE N2(01) 
CURRENCY_CODE AN3(156) 
AMOUNT X+N12 
charsecond_account_number[20]; 
55 SECOND_ACCOUNT_NUMBER&19(LLVAR) 
AB8583_Message_Indicatormessage_indicator; 
60 MESSAGE_INDICATOR&005(LLLVAR) 
ENCRYPTION_KEY_USED N1 
PIN加密/解密所使用的密钥标识,定义如下
不加密 
旧密钥 
新密钥 
MAC_KEY_USED N1 
不加密 
旧密钥 
新密钥 
MESSAGE_EFFECT N1 
消息用于生产环境 
消息用于测试环境 
2 ATM取款交易对帐标志 
保留 
银行POS取款交易对帐标志 
银行POS存款交易对帐标志 
商用POS消费交易对帐标志 
商用POS退款交易对帐标志 
NO_OF_UNLOGGED_TXNS N2 
AB8583_Auth_Operation_Codeauth_operation_code; 
61 AUTHORIZATION_OPERATION_CODE&022(LLLVAR) 
AUTHORIZATION_FUNCTION_CODE N1 
授权 
撤消授权 
消费 
退款 
取款 
查询 
AUTHORIZATION_MODE N1 
不需授权 
需授权 
AUTH_ID_RESPONSE_CODE N6 
SERVICE_BUSINESS_CODE N4 
INVOICE_NUMBER N10 
charauthorizing_agent_institution_id_code[12]; 
62 AUTHORIZING_AGENT_INSTITUTION_IDENTIFICATION_CODE&011(LLLVAR) 
chardestination_institution_id_code[12]; 
63 DESTINATION_INSTITUTION_IDENTIFICATION_CODE&011(LLLVAR) 
64 
charsettlement_code; 
66 SETTLEMENT_CODE N1 
charnetwork_management_information_code[4]; 
70 NETWORK_MANAGEMENT_INformATION_CODE N3 
chardate_of_action[7]; 
73 DATE_OF_ACTION N6 
longnumber_of_credits; 
74 NUMBER_OF_CREDITS N10 
longreversal_number_of_credits; 
75 REVERSAL_NUMBER_OF_CREDITS N10 
longnumber_of_debits; 
76 NUMBER_OF_DEBITS N10 
longrevsersal_number_of_debits; 
77 REVERSAL_NUMBER_OF_DEBITS N10 
longnumber_of_transfer; 
78 NUMBER_OF_TRANSFER N10 
longreversal_number_of_transfer; 
79 REVERSAL_NUMBER_OF_TRANSFER N10 
longnumber_of_inquiries; 
80 NUMBER_OF_INQUIRIES N10 
doubleprocessing_fee_amount_of_credits; 
82 PROCESSING_FEE_AMOUNT_OF_CREDITS N12 
doubleprocessing_fee_amount_of_debits; 
84 PROCESSING_FEE_AMOUNT_OF_DEBITS N12 
doubleamount_of_credits; 
86 AMOUNT_OF_CREDITS N16 
doublereversal_amount_of_credits; 
87 REVERSAL_AMOUNT_OF_CREDITS N16 
doubleamount_of_debits; 
88 AMOUNT_OF_DEBITS N16 
doublereversal_amount_of_debits; 
89 REVERSAL_AMOUNT_OF_DEBITS N16 
AB8583_Original_Data_Elementsoriginal_data_elements; 
90 ORIGINAL_DATA_ELEMENTS N42 
冲正交易所用的原始数据记录,内容如下
ORIGINAL_DATA_ELEMENTS 
ORG_MESSAGE_TYPE N4 
ORG_SYSTEM_TRACE_NUMBER N6 
ORG_TRANSACTION_DATA_TIME N10 
ORG_ACQR_INST_ID_CODE N11 
ORG_FORW_INST_ID_CODE N11 
AB8583_Replacement_Amountsreplacement_amounts; 
95 REPLACEMENT_AMOUNTS AN42 
charmessage_securty_code[8]; 
96 MESSAGE_SECURTY_CODE B64 
doubleamount_of_net_settlement; 
97 AMOUNT_OF_NET_SETTLEMENT X+N16 
charsettlement_institution_id_code[12]; 
99 SETTLEMENT_INSTITUTION_IDENTIFICATION_CODE&11(LLVAR) 
charreceiveing_institution_id_code[12]; 
100 RECEIVEING_INSTITUTION_IDENTIFICATION_CODE&11(LLVAR) 
charsender_institution_id_code[12]; 
120 SENDER_INSTITUTION_IDENTIFICATION_CODE&11(LLVAR) 
longsender_reference_number; 
121 SENDER_REFERENCE_NUMBER AN12 
charMAC[8]; 
128 MESSAGE_AUTHENTICATION_CODE B64
 htldm 回复于:2003-08-31 22:16:18

引用:
#include <stdio.h>; 
#include <string.h>; 
#include <stddef.h>; 
#include "AB8583.h" 
#define SIZEOF(type,value)((int)(sizeof(((type *)0)->;value))) 
#define CHG(value)AB_BIT_##value,offsetof(AB8583,value),SIZEOF(AB8583,value) 

#define CHG_HTON1 
#define CHG_NTOH2 
#define CHG_HTOS3 
#define CHG_STOH4 
#defineCHAR_CREDIT'C' 
#defineCHAR_DEBIT'D' 

typedef struct 

intbitName; 
intoffset; 
intvalsize; 
intsize; 
int(*chgF)(int chg,void *value,int size, 
char *buf,int bufLen,int *bufUse); 
} AB8583Chg; 

static int chg_char_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_str_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_str_llvar(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_str_lllvar(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_bit_bit(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_long_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_long_lllvar(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_double_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_double_xn(int chg,void *value, 
蓝田玉int size,char *buf,int bufLen,int *bufUse); 
static int chg_SecurityCtrlInfo_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_BalanceAmount_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_MessageIndicator_lllvar(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_AuthOperationCode_lllvar(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_OriginalDataElements_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 
static int chg_ReplacementAmounts_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse); 

static AB8583ChgchgList[] 
={ 

{ CHG(extend_bitmap),64, chg_bit_bit }, 
{ CHG(primary_account_number),19, chg_str_llvar }, 
{ CHG(processing_code),6,  chg_str_n }, 
{ CHG(amount_of_transactions),12, chg_double_n }, 
{ CHG(amount_of_settlement),10, chg_double_n }, 
{ CHG(transmission_date_and_time),10, chg_long_n }, 
{ CHG(system_trace_audit_number),6,  chg_long_n }, 
{ CHG(time_of_local_transaction),6,  chg_str_n }, 
{ CHG(date_of_local_transaction),4,  chg_str_n }, 
{ CHG(date_of_settlement),4,  chg_str_n }, 
{ CHG(date_of_capture),4,  chg_str_n }, 
{ CHG(business_type),3,  chg_str_n }, 
{ CHG(point_of_service_entry_mode),3,  chg_str_n }, 
{ CHG(point_of_service_PIN_capture_code),2,  chg_str_n }, 
{ CHG(fee_of_transaction),8,  chg_double_n }, 
{ CHG(fee_of_kick_back),8,  chg_double_xn }, 
{ CHG(acquiring_institution_id_code),11, chg_str_llvar }, 
{ CHG(forwarding_institution_id_code),11, chg_str_llvar }, 
{ CHG(track_2_data),37, chg_str_llvar }, 
{ CHG(track_3_data),104,chg_str_lllvar }, 
{ CHG(retrieval_reference_number),12, chg_str_n }, 
{ CHG(auth_id_response),6,  chg_str_n }, 
{ CHG(response_code),2,  chg_str_n }, 
{ CHG(card_acceptor_terminal_id),8,  chg_str_n }, 
{ CHG(card_acceptor_id_code),15, chg_str_n }, 
{ CHG(card_acceptor_name_location),40, chg_str_n }, 
{ CHG(additional_response_data),25, chg_str_llvar }, 
{ CHG(broadcast_message),999,chg_str_lllvar }, 
{ CHG(currency_code_of_transaction),3,  chg_str_n }, 
{ CHG(currency_code_of_settlement),3,  chg_str_n }, 
{ CHG(PIN),64, chg_bit_bit }, 
{ CHG(security_ctrl_info),16, chg_SecurityCtrlInfo_n }, 
{ CHG(balance_amount),43, chg_BalanceAmount_n }, 
{ CHG(second_account_number),19, chg_str_n }, 
{ CHG(message_indicator),5, chg_MessageIndicator_lllvar}, 
{ CHG(auth_operation_code),       22,chg_AuthOperationCode_lllvar}, 
{ CHG(auth_agent_institution_id_code),11, chg_str_lllvar }, 
{ CHG(destination_institution_id_code),11, chg_str_lllvar }, 
{ CHG(MAC64),64, chg_bit_bit}, 
{ CHG(settlement_code),1,  chg_char_n }, 
{ CHG(network_management_information_code),3,  chg_str_n }, 
{ CHG(date_of_action),6,  chg_str_n }, 
{ CHG(number_of_credits),10, chg_long_n }, 
{ CHG(reversal_number_of_credits),10, chg_long_n }, 
{ CHG(number_of_debits),10, chg_long_n }, 
{ CHG(reversal_number_of_debits),10, chg_long_n }, 
{ CHG(number_of_transfer),10, chg_long_n }, 
{ CHG(reversal_number_of_transfer),10, chg_long_n }, 
{ CHG(number_of_inquiries),10, chg_long_n }, 
{ CHG(number_of_authorizations),10, chg_long_n }, 
{ CHG(processing_fee_amount_of_credits),12, chg_double_n }, 
{ CHG(processing_fee_amount_of_debits),12, chg_double_n }, 
{ CHG(amount_of_credits),16, chg_double_n }, 
{ CHG(reversal_amount_of_credits),16, chg_double_n }, 
{ CHG(amount_of_debits),16, chg_double_n }, 
{ CHG(reversal_amount_of_debits),16, chg_double_n }, 
{ CHG(original_data_elements),42, chg_OriginalDataElements_n}, 
{ CHG(replacement_amounts),42, chg_ReplacementAmounts_n }, 
{ CHG(message_security_code),64, chg_bit_bit }, 
{ CHG(amount_of_net_settlement),16, chg_double_xn }, 
{ CHG(settlement_institution_id_code),11, chg_str_llvar }, 
{ CHG(receiveing_institution_id_code),11, chg_str_llvar }, 
{ CHG(trans_rem),100,chg_str_lllvar }, 
{ CHG(sender_institution_id_code),11, chg_str_lllvar }, 
{ CHG(sender_reference_number),12, chg_long_lllvar }, 
{ CHG(pid_no),15, chg_str_lllvar }, 
{ CHG(operator),16,  chg_str_lllvar }, 
{ CHG(checker),16,  chg_str_lllvar }, 
{ CHG(add_auth_id_response),13,  chg_str_lllvar }, 
{ CHG(MAC),64, chg_bit_bit}, 

{ 0,0,0,0,NULL} 

}; 

static int chg_move(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

if (*bufUse+size>;bufLen) 
return(-1); 
switch(chg) 

case CHG_HTOS: 
memcpy(buf+*bufUse,value,size);break; 
case CHG_STOH: 
memcpy(value,buf+*bufUse,size);break; 
default: 
return(-1); 
}; 
*bufUse=*bufUse+size; 
return(0); 

static int chg_str_move(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

intlen; 

switch(chg) 

case CHG_HTOS: 
len=strlen((char *)value); 
if ((len>;size)||(*bufUse+len>;bufLen)) 
return(-1); 
strcpy(buf+*bufUse,(char *)value); 
*bufUse=*bufUse+len+1; 
break; 
case CHG_STOH: 
len=strlen(buf+*bufUse); 
if ((len>;size)||(*bufUse+len>;bufLen)) 
return(-1); 
strcpy((char *)value,buf+*bufUse); 
*bufUse=*bufUse+len+1; 
break; 
default: 
return(-1); 
}; 
return(0); 


static int chg_char_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

switch(chg) 

case CHG_HTON: 
if (*bufUse+size>;bufLen) 
return(-1); 
memcpy(buf+*bufUse,value,size); 
*bufUse=*bufUse+size; 
break; 
case CHG_NTOH: 
if (*bufUse+size>;bufLen) 
return(-1); 
memcpy(value,buf+*bufUse,size); 
*bufUse=*bufUse+size; 
break; 
case CHG_HTOS: 
case CHG_STOH: 
return(chg_move(chg,value,size,buf,bufLen,bufUse)); 
default: 
return(-1); 
}; 
return(0); 


static int chg_str_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

intlen,i; 

switch(chg) 

case CHG_HTON: 
if (*bufUse+size>;bufLen) 
return(-1); 
len=strlen((char *)value); 
strncpy(buf+*bufUse,(char *)value,size); 
if (len<size) 
memset(buf+*bufUse+len,' ',size-len); 
*bufUse=*bufUse+size; 
break; 
case CHG_NTOH: 
if (*bufUse+size>;bufLen) 
return(-1); 
strncpy((char *)value,buf+*bufUse,size); 
((char *)value)[size]='\0'; 
for(i=size-1; i>;0&&(((char *)value)==' '); --i) 
((char *)value)='\0'; 
*bufUse=*bufUse+size; 
break; 
case CHG_HTOS: 
case CHG_STOH: 
return(chg_str_move(chg,value,size,buf,bufLen,bufUse)); 
default: 
return(-1); 
}; 
return(0); 


static int chg_str_llvar(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

inti,len; 
char*s; 
charc1,c2; 

s=(char *)value; 
switch(chg) 

case CHG_HTON: 
len=strlen(s); 
if ((len>;99)||(len>;size)||(*bufUse+len+2>;bufLen)) 
return(-1); 
buf[*bufUse]=(char)('0'+len/10); 
buf[*bufUse+1]=(char)('0'+len%10); 
if (len>;0) 
strncpy(buf+*bufUse+2,s,len); 
*bufUse=*bufUse+2+len; 
break; 
case CHG_NTOH: 
if (*bufUse+2>;bufLen) 
return(-1); 
c1=buf[*bufUse]; 
c2=buf[*bufUse+1]; 
if ((c1<'0')||(c1>;'9')||(c2<'0')||(c2>;'9')) 
return(-1); 
len=(c1-'0')*10+(c2-'0'); 
if (*bufUse+2+len>;bufLen) 
return(-1); 
if (len>;0) 
memcpy(s,buf+*bufUse+2,len); 
s[len]='\0'; 
*bufUse=*bufUse+2+len; 
break; 
case CHG_HTOS: 
case CHG_STOH: 
return(chg_str_move(chg,value,size,buf,bufLen,bufUse)); 
default: 
return(-1); 
}; 
return(0); 


static int chg_str_lllvar(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

inti,len; 
char*s; 
charc1,c2,c3; 

s=(char *)value; 
switch(chg) 

case CHG_HTON: 
len=strlen(s); 
if ((len>;999)||(len>;size)||(*bufUse+len+3>;bufLen)) 
return(-1); 
buf[*bufUse]=(char)('0'+len/100); 
buf[*bufUse+1]=(char)('0'+(len%100)/10); 
buf[*bufUse+2]=(char)('0'+len%10); 
if (len>;0) 
strncpy(buf+*bufUse+3,s,len); 
*bufUse=*bufUse+3+len; 
break; 
case CHG_NTOH: 
if (*bufUse+2>;bufLen) 
return(-1); 
c1=buf[*bufUse]; 
c2=buf[*bufUse+1]; 
c3=buf[*bufUse+2]; 
if ((c1<'0')||(c1>;'9') 
||(c2<'0')||(c2>;'9') 
||(c3<'0')||(c3>;'9')) 
return(-1); 
len=(c1-'0')*100+(c2-'0')*10+(c3-'0'); 
if (*bufUse+3+len>;bufLen) 
return(-1); 
if (len>;0) 
memcpy(s,buf+*bufUse+3,len); 
s[len]='\0'; 
*bufUse=*bufUse+3+len; 
break; 
case CHG_HTOS: 
case CHG_STOH: 
return(chg_str_move(chg,value,size,buf,bufLen,bufUse)); 
default: 
return(-1); 
}; 
return(0); 

static int chg_bit_bit(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

switch(chg) 

case CHG_HTON: 
if (*bufUse+size/8>;bufLen) 
return(-1); 
memcpy(buf+*bufUse,value,size/8); 
*bufUse=*bufUse+size/8; 
break; 
case CHG_NTOH: 
if (*bufUse+size/8>;bufLen) 
return(-1); 
memcpy(value,buf+*bufUse,size/8); 
*bufUse=*bufUse+size/8; 
break; 
case CHG_HTOS: 
case CHG_STOH: 
return(chg_move(chg,value,size/8,buf,bufLen,bufUse)); 
default: 
return(-1); 
}; 
return(0); 


static int chg_long_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

unsigned long*v; 
chars[32]; 
intlen; 
charformat[16]; 

v=(unsigned long *)value; 
switch(chg) 

case CHG_HTON: 
if (*bufUse+size>;bufLen) 
return(-1); 
sprintf(format,"%%0%du",size); 
sprintf(s,format,*v); 
len=strlen(s); 
if (len!=size) 
return(-1); 
memcpy(buf+*bufUse,s,len); 
*bufUse=*bufUse+size; 
break; 
case CHG_NTOH: 
if (*bufUse+size>;bufLen) 
return(-1); 
if (size>;30) 
return(-1); 
memcpy(s,buf+*bufUse,size); 
s[size]='\0'; 
if (sscanf(s,"%u",v)!=1) 
return(-1); 
*bufUse=*bufUse+size; 
break; 
case CHG_HTOS: 
case CHG_STOH: 
return(chg_move(chg,value,sizeof(long),buf,bufLen,bufUse)); 
default: 
return(-1); 
}; 
return(0); 

static int chg_long_lllvar(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

unsigned long*v; 
chars[32]; 
intlen; 
charformat[16]; 

v=(unsigned long *)value; 
switch(chg) 

case CHG_HTON: 
if (*bufUse+size+3>;bufLen) 
return(-1); 
sprintf(s,"%u",*v); 
len=strlen(s); 
if (len>;size) 
return(-1); 
buf[*bufUse]='0'+(char)(len/100); 
buf[*bufUse+1]='0'+(char)((len%100)/10); 
buf[*bufUse+2]='0'+(char)(len%10); 
memcpy(buf+(*bufUse)+3,s,len); 
*bufUse=*bufUse+len+3; 
break; 
case CHG_NTOH: 
if (*bufUse+3>;bufLen) 
return(-1); 
if (buf[*bufUse]<'0'||buf[*bufUse]>;'9' 
||buf[*bufUse+1]<'0'||buf[*bufUse+1]>;'9' 
||buf[*bufUse+2]<'0'||buf[*bufUse+2]>;'9') 
return(-1); 
len=(buf[*bufUse]-'0')*100+(buf[*bufUse+1]-'0') 
+(buf[*bufUse+2]-'0'); 
if (len>;size) 
return(-1); 
if (*bufUse+len+3>;bufLen) 
return(-1); 
if (len>;30) 
return(-1); 
memcpy(s,buf+*bufUse+3,len); 
s[len]='\0'; 
if (sscanf(s,"%u",v)!=1) 
return(-1); 
*bufUse=*bufUse+3+len; 
break; 
case CHG_HTOS: 
case CHG_STOH: 
return(chg_move(chg,value,sizeof(long),buf,bufLen,bufUse)); 
default: 
return(-1); 
}; 
return(0); 

static void del_dot(char *s) 

inti=0; 
intd=0; 

while(s!='\0') 

if (s=='.') 
d=1; 
if (d) 
s=s[i+1]; 
++i; 
}; 

static int add_dot(char *s) 

intlen; 
inti; 

i=0; 
while(s==' ') 
++i; 
if (i!=0) 
strcpy(s,s+i); 

len=strlen(s); 
if (len<2) 
return(-1); 

for(i=0; i<len; ++i) 
if (s<'0'||s>;'9') 
return(-1); 
s[len+1]='\0'; 
s[len]  =s[len-1]; 
s[len-1]=s[len-2]; 
s[len-2]='.'; 
return(0); 


static int chg_double_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

double*v; 
chars[64]; 
intlen; 
charformat[16]; 

v=(double *)value; 
switch(chg) 

case CHG_HTON: 
if (*bufUse+size>;bufLen) 
return(-1); 
if (*v<0) 
return(-1); 
sprintf(format,"%%0%d.2lf",size+1); 
sprintf(s,format,*v); 
del_dot(s); 
len=strlen(s); 
if (len!=size) 
return(-1); 
memcpy(buf+*bufUse,s,len); 
*bufUse=*bufUse+size; 
break; 
case CHG_NTOH: 
if (*bufUse+size>;bufLen) 
return(-1); 
if (size>;60) 
return(-1); 
memcpy(s,buf+*bufUse,size); 
s[size]='\0'; 
if (add_dot(s)!=0) 
return(-1); 
if (sscanf(s,"%lf",v)!=1) 
return(-1); 
*bufUse=*bufUse+size; 
break; 
case CHG_HTOS: 
case CHG_STOH: 
return(chg_move(chg,value,sizeof(double),buf,bufLen,bufUse)); 
default: 
return(-1); 
}; 
return(0); 

static int chg_double_xn(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

doublev; 
intr; 
charx; 

switch(chg) 

case CHG_HTON: 
if (*bufUse+size+1>;bufLen) 
return(-1); 
v=*(double *)value; 
if (v==0) 
*(buf+*bufUse)='0'; 
else if (v>;0) 
*(buf+*bufUse)=CHAR_CREDIT; 
else 

*(buf+*bufUse)=CHAR_DEBIT; 
v=-v; 
}; 
*bufUse=*bufUse+1; 
r=chg_double_n(chg,(void *)&v, 
size,buf,bufLen,bufUse); 
break; 
case CHG_NTOH: 
if (*bufUse+size+1>;bufLen) 
return(-1); 
x=*(buf+*bufUse); 
if (x!='0'&&x!=CHAR_CREDIT&&x!=CHAR_DEBIT) 
return(-1); 
*bufUse=*bufUse+1; 
r=chg_double_n(chg,(void *)&v, 
size,buf,bufLen,bufUse); 
if (r!=0) 
return(r); 
if (x=='0') 

if (v!=0) 
return(-1); 
*(double *)value=0; 

else if (x==CHAR_CREDIT) 
*(double *)value=v; 
else *(double *)value=-v; 
r=0; 
break; 
case CHG_HTOS: 
case CHG_STOH: 
return(chg_move(chg,value,sizeof(double),buf,bufLen,bufUse)); 
default: 
r=-1; 
}; 
return(r); 


static int chg_SecurityCtrlInfo_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

intr; 
AB8583_Security_Ctrl_Info *p; 

if (chg==CHG_HTOS||chg==CHG_STOH) 
return(chg_move(chg,value,sizeof(AB8583_Security_Ctrl_Info), 
buf,bufLen,bufUse)); 

if ((size!=16) 
||(*bufUse+size>;bufLen)) 
return(-1); 

p=(AB8583_Security_Ctrl_Info *)value; 
r=chg_long_n(chg,(void *)&p->;sync_counter, 
8,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;reserved, 
7,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_char_n(chg,(void *)&p->;key_type, 
1,buf,bufLen,bufUse); 
E: 
return(r); 


static int chg_BalanceAmountItem_n(int chg, 
AB8583_Balance_Amount_Item *p, 
int size,char *buf,int bufLen,int *bufUse) 

intr; 

if ((size!=20) 
||(*bufUse+size>;bufLen)) 
return(-1); 

r=chg_str_n(chg,(void *)&p->;account_type, 
2,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;amount_type, 
2,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;currency_code, 
3,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_double_xn(chg,(void *)&p->;amount, 
12,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 

E: 
return(r); 


static int chg_BalanceAmount_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

intr; 
AB8583_Balance_Amount*p; 
charlength[4]; 

if (chg==CHG_HTOS||chg==CHG_STOH) 
return(chg_move(chg,value,sizeof(AB8583_Balance_Amount), 
buf,bufLen,bufUse)); 
if ((size!=43) 
||(*bufUse+size>;bufLen)) 
return(-1); 

p=(AB8583_Balance_Amount *)value; 
switch(chg) 

case CHG_HTON: 
strcpy(length,"040"); 
r=chg_str_n(chg,length, 
3,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
break; 
case CHG_NTOH: 
r=chg_str_n(chg,p->;length, 
3,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
if (strcmp(p->;length,"040")!=0) 
{r=-1; 
goto E; 
}; 
break; 
default: 
r=-1; 
goto E; 
}; 
r=chg_BalanceAmountItem_n(chg,&p->;ledger_balance, 
20,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_BalanceAmountItem_n(chg,&p->;available_balance, 
20,buf,bufLen,bufUse); 
E: 
return(r); 


static int chg_MessageIndicator_lllvar(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

intr; 
AB8583_Message_Indicator*p; 
charlength[4]; 

if (chg==CHG_HTOS||chg==CHG_STOH) 
return(chg_move(chg,value,sizeof(AB8583_Message_Indicator), 
buf,bufLen,bufUse)); 
if ((size!=5) 
||(*bufUse+size>;bufLen)) 
return(-1); 

p=(AB8583_Message_Indicator *)value; 
switch(chg) 

case CHG_HTON: 
strcpy(length,"005"); 
r=chg_str_n(chg,length, 
3,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
break; 
case CHG_NTOH: 
r=chg_str_n(chg,length, 
3,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
if (strcmp(length,"005")!=0) 
{r=-1; 
goto E; 
}; 
break; 
default: 
r=-1; 
goto E; 
}; 

r=chg_char_n(chg,(void *)&p->;encryption_key_used, 
1,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_char_n(chg,(void *)&p->;mac_key_used, 
1,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_char_n(chg,(void *)&p->;message_effect, 
1,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;no_of_unlogged_txns, 
2,buf,bufLen,bufUse); 

E: 
return(r); 



static int chg_AuthOperationCode_lllvar(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

intr; 
AB8583_Auth_Operation_Code*p; 
charlength[4]; 

if (chg==CHG_HTOS||chg==CHG_STOH) 
return(chg_move(chg,value,sizeof(AB8583_Auth_Operation_Code), 
buf,bufLen,bufUse)); 
if ((size!=22) 
||(*bufUse+size+3>;bufLen)) 
return(-1); 

p=(AB8583_Auth_Operation_Code *)value; 
switch(chg) 

case CHG_HTON: 
strcpy(length,"022"); 
r=chg_str_n(chg,length, 
3,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
break; 
case CHG_NTOH: 
r=chg_str_n(chg,length, 
3,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
if (strcmp(length,"022")!=0) 
{r=-1; 
goto E; 
}; 
break; 
default: 
r=-1; 
goto E; 
}; 

r=chg_char_n(chg,(void *)&p->;auth_function_code, 
1,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_char_n(chg,(void *)&p->;auth_mode, 
1,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;auth_id_response_code, 
6,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;service_business_code, 
4,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;invoice_number, 
10,buf,bufLen,bufUse); 

E: 
return(r); 


static int chg_OriginalDataElements_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

intr; 
AB8583_Original_Data_Elements*p; 

if (chg==CHG_HTOS||chg==CHG_STOH) 
return(chg_move(chg,value,sizeof(AB8583_Original_Data_Elements), 
buf,bufLen,bufUse)); 
if ((size!=42) 
||(*bufUse+size>;bufLen)) 
return(-1); 

p=(AB8583_Original_Data_Elements *)value; 

r=chg_str_n(chg,(void *)&p->;org_message_type, 
4,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;org_system_trace_number, 
6,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;org_transaction_date_time, 
10,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;org_acqr_inst_id_code, 
11,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_str_n(chg,(void *)&p->;org_forw_inst_id_code, 
11,buf,bufLen,bufUse); 

E: 
return(r); 


static int chg_ReplacementAmounts_n(int chg,void *value, 
int size,char *buf,int bufLen,int *bufUse) 

intr; 
AB8583_Replacement_Amounts*p; 

if (chg==CHG_HTOS||chg==CHG_STOH) 
return(chg_move(chg,value,sizeof(AB8583_Replacement_Amounts), 
buf,bufLen,bufUse)); 
if ((size!=42) 
||(*bufUse+size>;bufLen)) 
return(-1); 

p=(AB8583_Replacement_Amounts *)value; 

r=chg_double_n(chg,&p->;actual_amount_of_transaction, 
12,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_double_n(chg,&p->;actual_amount_of_settlement, 
12,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_double_xn(chg,&p->;actual_amount_of_transaction_fee, 
8,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_double_xn(chg,&p->;actual_amount_of_settlement_fee, 
8,buf,bufLen,bufUse); 
E: 
return(r); 


/************************  HTON  or NTOH *********************/ 

static int chg_AB8583_n(int chg,AB8583 *data, 
char *buf,int bufLen,int *bufUse,int *lastField) 

intr,i; 

r=chg_str_n(chg,&data->;message_type, 
4,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 
r=chg_bit_bit(chg,&data->;primary_bitmap, 
64,buf,bufLen,bufUse); 
if (r!=0) 
goto E; 

for(i=0, r=0; (r==0)&&(chgList.bitName!=0); ++i) 
   if (AB8583_bitIsSet(data,chgList.bitName)) 
   { 
*lastField=chgList.bitName; 
r=(*chgList.chgF)(chg, 
((char *)data)+chgList.offset, 
chgList.size, 
buf,bufLen,bufUse); 
   }; 

E: 
return(r); 


int AB8583_hton(AB8583 *data,char *buf,int bufLen,int *bufUse,int *lastField) 

intr; 

*bufUse=0; 
*lastField=0; 
r=chg_AB8583_n(CHG_HTON,data,buf,bufLen,bufUse,lastField); 
return(r); 


int AB8583_ntoh(AB8583 *data,char *buf,int bufLen,int *bufUse,int *lastField) 

intr; 

AB8583_clear(data); 
*bufUse=0; 
*lastField=0; 
r=chg_AB8583_n(CHG_NTOH,data,buf,bufLen,bufUse,lastField); 
return(r); 


int AB8583_htos(AB8583 *data,char *buf,int bufLen,int *bufUse,int *lastField) 

intr; 

*bufUse=0; 
*lastField=0; 
r=chg_AB8583_n(CHG_HTOS,data,buf,bufLen,bufUse,lastField); 
return(r); 


int AB8583_stoh(AB8583 *data,char *buf,int bufLen,int *bufUse,int *lastField) 

intr; 

AB8583_clear(data); 
*bufUse=0; 
*lastField=0; 
r=chg_AB8583_n(CHG_STOH,data,buf,bufLen,bufUse,lastField); 
return(r); 


int AB8583_Val_to_Val(int BitNum,AB8583 *indata,AB8583 *outdata) 

int i; 

for(i=0;(chgList.bitName!=BitNum)&&(chgList.bitName!=0);i++); 

if(chgList.bitName==0) return(-1); 
memcpy((char *)outdata+chgList.offset, 
(char *)indata+chgList.offset,chgList.valsize); 
if(AB8583_setBit(outdata,BitNum)!=0) return(-1); 
return(0);