Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39613
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 82
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-19 14:23
个人简介

本尊不死,尔等终究为奴...

文章分类

全部博文(8)

文章存档

2016年(1)

2015年(4)

2013年(3)

我的朋友

分类: 信息化

2013-07-20 10:10:27

ISO8583报文域详解

ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。8583包前面一段为位图,用来确定包的字段域组成情况。

其中位图是8583包的灵魂,它是打包解包确定字段域的关键, 而了解每个字段域的属性则是填写数据的基础,

1、 位图描述如下:

位图位置:1

格式:定长

类型:B16(二进制16位,16*8=128bit

描述:

如将位图的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。

如使用某数据域,应在位图中将相应的位设位'1',如使用41域,需将位图的41位设为'1'

选用条件:如使用65128域,需设位图域第一位为'1'

2、每个域的定义如下:


点击(此处)折叠或打开

  1. typedef struct ISO8583

  2. {

  3. char *data; /*存放具体值*/

  4. int attribute; /*保留int bit_flag; /*域数据类型0 -- string, 1 -- int, 2 -- binary*/

  5. char *data_name; /*域名*/

  6. int length; /*数据域长度*/

  7. int length_in_byte;/*实际长度(如果是变长)*/

  8. int variable_flag; /*是否变长标志0:否 2:2位变长,

  9. 3:3位变长*/

  10. int datatyp; /*0 -- string, 1 -- int, 2 -- binary*/

  11. */

  12. } ISO8583;

  13.  
  14. ISO8583 Tbl8583[128] =

  15. {


  16. /* FLD 1 */ {0,"BIT MAP,EXTENDED ", 8, 0, 0, 2, NULL,0},

  17. /* FLD 2 */ {0,"PRIMARY ACCOUNT NUMBER ", 22, 0, 2, 0, NULL,0},

  18. /* FLD 3 */ {0,"PROCESSING CODE ", 6, 0, 0, 0, NULL,0},

  19. /* FLD 4 */ {0,"AMOUNT, TRANSACTION ", 12, 0, 0, 1, NULL,0},

  20. /* FLD 5 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},

  21. /* FLD 6 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},

  22. /* FLD 7 */ {0,"TRANSACTION DATE AND TIME ", 10, 0, 0, 0, NULL,0},

  23. /* FLD 8 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},

  24. /* FLD 9 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},

  25. /* FLD 10 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},

  26. /* FLD 11 */ {0,"SYSTEM TRACE AUDIT NUMBER ", 6, 0, 0, 1, NULL,0},

  27. /* FLD 12 */ {0,"TIME, LOCAL TRANSACTION ", 6, 0, 0, 0, NULL,0},

  28. /* FLD 13 */ {0,"DATE, LOCAL TRANSACTION ", 4, 0, 0, 0, NULL,0},

  29. /* FLD 14 */ {0,"DATE, EXPIRATION ", 4, 0, 0, 0, NULL,0},

  30. /* FLD 15 */ {0,"DATE, SETTLEMENT ", 4, 0, 0, 0, NULL,0},

  31. /* FLD 16 */ {0,"NO USE ", 4, 0, 0, 0, NULL,0},

  32. /* FLD 17 */ {0,"DATE, CAPTURE ", 4, 0, 0, 0, NULL,0},

  33. /* FLD 18 */ {0,"MERCHANT'S TYPE ", 4, 0, 0, 0, NULL,0},

  34. /* FLD 19 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},

  35. /* FLD 20 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},

  36. /* FLD 21 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},

  37. /* FLD 22 */ {0,"POINT OF SERVICE ENTRY MODE ", 3, 0, 0, 0, NULL,0},

  38. /* FLD 23 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},

  39. /* FLD 24 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},

  40. /* FLD 25 */ {0,"POINT OF SERVICE CONDITION CODE ", 2, 0, 0, 0, NULL,0},

  41. /* FLD 26 */ {0,"NO USE ", 2, 0, 0, 0, NULL,0},

  42. /* FLD 27 */ {0,"NO USE ", 1, 0, 0, 0, NULL,0},

  43. /* FLD 28 */ {0,"field27 ", 6, 0, 0, 0, NULL,0},

  44. /* FLD 29 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},

  45. /* FLD 30 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},

  46. /* FLD 31 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},

  47. /* FLD 32 */ {0,"ACQUIRER INSTITUTION ID. CODE ", 11, 0, 2, 0, NULL,0},

  48. /* FLD 33 */ {0,"FORWARDING INSTITUTION ID. CODE ", 11, 0, 2, 0, NULL,0},

  49. /* FLD 34 */ {0,"NO USE ", 28, 0, 2, 0, NULL,0},

  50. /* FLD 35 */ {0,"TRACK 2 DATA ", 37, 0, 2, 0, NULL,0},

  51. /* FLD 36 */ {0,"TRACK 3 DATA ",104, 0, 3, 0, NULL,0},

  52. /* FLD 37 */ {0,"RETRIEVAL REFERENCE NUMBER ", 12, 0, 0, 0, NULL,0},

  53. /* FLD 38 */ {0,"AUTH. IDENTIFICATION RESPONSE ", 6, 0, 0, 0, NULL,0},

  54. /* FLD 39 */ {0,"RESPONSE CODE ", 2, 0, 0, 0, NULL,0},

  55. /* FLD 40 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},

  56. /* FLD 41 */ {0,"CARD ACCEPTOR TERMINAL ID. ", 8, 0, 0, 0, NULL,0},

  57. /* FLD 42 */ {0,"CARD ACCEPTOR IDENTIFICATION CODE ", 15, 0, 0, 0, NULL,0},

  58. /* FLD 43 */ {0,"CARD ACCEPTOR NAME LOCATION ", 40, 0, 0, 0, NULL,0},

  59. /* FLD 44 */ {0,"ADDITIONAL RESPONSE DATA ", 25, 0, 2, 0, NULL,0},

  60. /* FLD 45 */ {0,"NO USE ", 76, 0, 2, 0, NULL,0},

  61. /* FLD 46 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  62. /* FLD 47 */ {0,"field47 ",999, 0, 3, 0, NULL,0},

  63. /* FLD 48 */ {0,"ADDITIONAL DATA --- PRIVATE ",999, 0, 3, 0, NULL,0},

  64. /* FLD 49 */ {0,"CURRENCY CODE,TRANSACTION ", 3, 0, 0, 0, NULL,0},

  65. /* FLD 50 */ {0,"CURRENCY CODE,SETTLEMENT ", 3, 0, 0, 0, NULL,0},

  66. /* FLD 51 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},

  67. /* FLD 52 */ {0,"PERSONAL IDENTIFICATION NUMBER DATA ", 8, 0, 0, 2, NULL,0},

  68. /* FLD 53 */ {0,"SECURITY RELATED CONTROL INformATION", 16, 0, 0, 0, NULL,0},

  69. /* FLD 54 */ {0,"ADDITIONAL AMOUNTS ",120, 0, 3, 0, NULL,0},

  70. /* FLD 55 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  71. /* FLD 56 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  72. /* FLD 57 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  73. /* FLD 58 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  74. /* FLD 59 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  75. /* FLD 60 */ {0,"NO USE ", 5, 0, 3, 0, NULL,0},

  76. /* FLD 61 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  77. /* FLD 62 */ {0,"NO USE ", 11, 0, 3, 0, NULL,0},

  78. /* FLD 63 */ {0,"NO USE ", 11, 0, 3, 0, NULL,0},

  79. /* FLD 64 */ {0,"MESSAGE AUTHENTICATION CODE FIELD ", 8, 0, 0, 2, NULL,0},

  80. /* FLD 65 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  81. /* FLD 66 */ {0,"NO USE ", 1, 0, 0, 0, NULL,0},

  82. /* FLD 67 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  83. /* FLD 68 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  84. /* FLD 69 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  85. /* FLD 70 */ {0,"SYSTEM MANAGEMENT INformATION CODE ", 3, 0, 0, 0, NULL,0},

  86. /* FLD 71 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  87. /* FLD 72 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  88. /* FLD 73 */ {0,"NO USE ", 6, 0, 0, 0, NULL,0},

  89. /* FLD 74 */ {0,"NUMBER OF CREDITS ", 10, 0, 0, 0, NULL,0},

  90. /* FLD 75 */ {0,"REVERSAL NUMBER OF CREDITS ", 10, 0, 0, 0, NULL,0},

  91. /* FLD 76 */ {0,"NUMBER OF DEBITS ", 10, 0, 0, 0, NULL,0},

  92. /* FLD 77 */ {0,"REVERSAL NUMBER OF DEBITS ", 10, 0, 0, 0, NULL,0},

  93. /* FLD 78 */ {0,"NUMBER OF TRANSFER ", 10, 0, 0, 0, NULL,0},

  94. /* FLD 79 */ {0,"REVERSAL NUMBER OF TRANSFER ", 10, 0, 0, 0, NULL,0},

  95. /* FLD 80 */ {0,"NUMBER OF INQUIRS ", 10, 0, 0, 0, NULL,0},

  96. /* FLD 81 */ {0,"AUTHORIZATION NUMBER ", 10, 0, 0, 0, NULL,0},

  97. /* FLD 82 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},

  98. /* FLD 83 */ {0,"CREDITS,TRANSCATION FEEAMOUNT ", 12, 0, 0, 0, NULL,0},

  99. /* FLD 84 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},

  100. /* FLD 85 */ {0,"DEBITS,TRANSCATION FEEAMOUNT ", 12, 0, 0, 0, NULL,0},

  101. /* FLD 86 */ {0,"AMOUNT OF CREDITS ", 16, 0, 0, 0, NULL,0},

  102. /* FLD 87 */ {0,"REVERSAL AMOUNT OF CREDITS ", 16, 0, 0, 0, NULL,0},

  103. /* FLD 88 */ {0,"AMOUNT OF DEBITS ", 16, 0, 0, 0, NULL,0},

  104. /* FLD 89 */ {0,"REVERSAL AMOUNT OF DEBITS ", 16, 0, 0, 0, NULL,0},

  105. /* FLD 90 */ {0,"ORIGINAL DATA ELEMENTS ", 42, 0, 0, 0, NULL,0},

  106. /* FLD 91 */ {0,"FILE UPDATE CODE ", 1, 0, 0, 0, NULL,0},

  107. /* FLD 92 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  108. /* FLD 93 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  109. /* FLD 94 */ {0,"SERVICE INDICATOR ", 7, 0, 0, 0, NULL,0},

  110. /* FLD 95 */ {0,"REPLACEMENT AMOUNTS ", 42, 0, 0, 0, NULL,0},

  111. /* FLD 96 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},

  112. /* FLD 97 */ {0,"AMOUNT OF NET SETTLEMENT ", 16, 0, 0, 0, NULL,0},

  113. /* FLD 98 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  114. /* FLD 99 */ {0,"SETTLEMENT INSTITUTION ID ", 11, 0, 2, 0, NULL,0},

  115. /* FLD 100 */ {0,"RECVEING INSTITUTION ID ", 11, 0, 2, 0, NULL,0},

  116. /* FLD 101 */ {0,"FILENAME ", 17, 0, 2, 0, NULL,0},

  117. /* FLD 102 */ {0,"ACCOUNT IDENTIFICATION1 ", 28, 0, 2, 0, NULL,0},

  118. /* FLD 103 */ {0,"ACCOUNT IDENTIFICATION2 ", 28, 0, 2, 0, NULL,0},

  119. /* FLD 104 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  120. /* FLD 105 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  121. /* FLD 106 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  122. /* FLD 107 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  123. /* FLD 108 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  124. /* FLD 109 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  125. /* FLD 110 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  126. /* FLD 111 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  127. /* FLD 112 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  128. /* FLD 113 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  129. /* FLD 114 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  130. /* FLD 115 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  131. /* FLD 116 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  132. /* FLD 117 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  133. /* FLD 118 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  134. /* FLD 119 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  135. /* FLD 120 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  136. /* FLD 121 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  137. /* FLD 122 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  138. /* FLD 123 */ {0,"NEW PIN DATA ", 8, 0, 3, 2, NULL,0},

  139. /* FLD 124 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  140. /* FLD 125 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  141. /* FLD 126 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  142. /* FLD 127 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},

  143. /* FLD 128 */ {0,"MESSAGE AUTHENTICATION CODE FIELD ", 8, 0, 0, 2, NULL,0},

  144. };


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) - 基本位图和扩展位图

位图位置:1

格式:定长

类型: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

类型:ANS...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密钥索引1N1’或‘2

7MAC密钥索引1N1’或‘2

811MAC检查数据4B

1215填充4N

BOC信用卡网络中PINMAC各使用两个密钥---'1'号和'2'密钥,交易中计算PINMAC时只能各用某一个KEY,同时需将所用的KEY索引号填写此域。

选用条件:如果有PIN域或MAC域,一定需有此域。

32Bit54附加金额(Additional Amounts)

位图位置:54

格式:LLLVAR

类型:ANS...120

描述:此域由授权行主机将客户的余额返回给收单终端,以显示或打印在客户回单上。

在此域中最多可有6个余额返回,每个余额返回格式如下:

位置描述

01处理码3456位定义的帐号类型

23金额类型:01-帐户金额

02-可用金额

03-拥有金额

04-应付金额

40-可用取款限额

56-可用转帐限额

46金额的货币代码

7D’-借记金额,’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元。

D0000000020000000”,表示借方(''?)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 N...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 Z...37(LLVAR)

chartrack_3_data[105];

36 TRACK_3_DATA Z...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 ANS...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

1 用于交换中心和成员行机构之间的PIN加密解密

2 用于交换中心和成员行机构之间的MAC计算

3 用于成员行和终端之间的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 N...19(LLVAR)

AB8583_Message_Indicatormessage_indicator;

60 MESSAGE_INDICATOR N...005(LLLVAR)

ENCRYPTION_KEY_USED N1

PIN加密/解密所使用的密钥标识,定义如下:

0 不加密

1 旧密钥

2 新密钥

MAC_KEY_USED N1

0 不加密

1 旧密钥

2 新密钥

MESSAGE_EFFECT N1

0 消息用于生产环境

1 消息用于测试环境

2 ATM取款交易对帐标志

3 保留

4 银行POS取款交易对帐标志

5 银行POS存款交易对帐标志

6 商用POS消费交易对帐标志

7 商用POS退款交易对帐标志

NO_OF_UNLOGGED_TXNS N2

AB8583_Auth_Operation_Codeauth_operation_code;

61 AUTHORIZATION_OPERATION_CODE N...022(LLLVAR)

AUTHORIZATION_FUNCTION_CODE N1

0 授权

1 撤消授权

2 消费

3 退款

4 取款

5 查询

AUTHORIZATION_MODE N1

0 不需授权

1 需授权

AUTH_ID_RESPONSE_CODE N6

SERVICE_BUSINESS_CODE N4

INVOICE_NUMBER N10

charauthorizing_agent_institution_id_code[12];

62 AUTHORIZING_AGENT_INSTITUTION_IDENTIFICATION_CODE N...011(LLLVAR)

chardestination_institution_id_code[12];

63 DESTINATION_INSTITUTION_IDENTIFICATION_CODE N...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 N...11(LLVAR)

charreceiveing_institution_id_code[12];

100 RECEIVEING_INSTITUTION_IDENTIFICATION_CODE N...11(LLVAR)

charsender_institution_id_code[12];

120 SENDER_INSTITUTION_IDENTIFICATION_CODE N...11(LLVAR)

longsender_reference_number;

121 SENDER_REFERENCE_NUMBER AN12

charMAC[8];

128 MESSAGE_AUTHENTICATION_CODE B64


点击(此处)折叠或打开

  1. --------------------------------------------------------------------------------




  2. #include <stdio.h>;

  3. #include <string.h>;

  4. #include <stddef.h>;

  5. #include "AB8583.h"

  6. #define SIZEOF(type,value)((int)(sizeof(((type *)0)->;value)))



  7. #define CHG(value)AB_BIT_##value,offsetof(AB8583,value),SIZEOF(AB8583,value)



  8. #define CHG_HTON1

  9. #define CHG_NTOH2

  10. #define CHG_HTOS3

  11. #define CHG_STOH4

  12. #defineCHAR_CREDIT'C'

  13. #defineCHAR_DEBIT'D'

  14. typedef struct

  15. {

  16. intbitName;

  17. intoffset;

  18. intvalsize;

  19. intsize;

  20. int(*chgF)(int chg,void *value,int size,

  21. char *buf,int bufLen,int *bufUse);

  22. } AB8583Chg;

  23. static int chg_char_n(int chg,void *value,

  24. int size,char *buf,int bufLen,int *bufUse);

  25. static int chg_str_n(int chg,void *value,

  26. int size,char *buf,int bufLen,int *bufUse);

  27. static int chg_str_llvar(int chg,void *value,

  28. int size,char *buf,int bufLen,int *bufUse);

  29. static int chg_str_lllvar(int chg,void *value,

  30. int size,char *buf,int bufLen,int *bufUse);

  31. static int chg_bit_bit(int chg,void *value,

  32. int size,char *buf,int bufLen,int *bufUse);

  33. static int chg_long_n(int chg,void *value,

  34. int size,char *buf,int bufLen,int *bufUse);

  35. static int chg_long_lllvar(int chg,void *value,

  36. int size,char *buf,int bufLen,int *bufUse);

  37. static int chg_double_n(int chg,void *value,

  38. int size,char *buf,int bufLen,int *bufUse);

  39. static int chg_double_xn(int chg,void *value,

  40. int size,char *buf,int bufLen,int *bufUse);

  41. static int chg_SecurityCtrlInfo_n(int chg,void *value,



  42. int size,char *buf,int bufLen,int *bufUse);

  43. static int chg_BalanceAmount_n(int chg,void *value,

  44. int size,char *buf,int bufLen,int *bufUse);

  45. static int chg_MessageIndicator_lllvar(int chg,void *value,



  46. int size,char *buf,int bufLen,int *bufUse);

  47. static int chg_AuthOperationCode_lllvar(int chg,void *value,



  48. int size,char *buf,int bufLen,int *bufUse);

  49. static int chg_OriginalDataElements_n(int chg,void *value,



  50. int size,char *buf,int bufLen,int *bufUse);

  51. static int chg_ReplacementAmounts_n(int chg,void *value,



  52. int size,char *buf,int bufLen,int *bufUse);

  53. static AB8583ChgchgList[]

  54. ={

  55. { CHG(extend_bitmap),64, chg_bit_bit },

  56. { CHG(primary_account_number),19, chg_str_llvar },

  57. { CHG(processing_code),6, chg_str_n },

  58. { CHG(amount_of_transactions),12, chg_double_n },

  59. { CHG(amount_of_settlement),10, chg_double_n },

  60. { CHG(transmission_date_and_time),10, chg_long_n },

  61. { CHG(system_trace_audit_number),6, chg_long_n },

  62. { CHG(time_of_local_transaction),6, chg_str_n },

  63. { CHG(date_of_local_transaction),4, chg_str_n },

  64. { CHG(date_of_settlement),4, chg_str_n },

  65. { CHG(date_of_capture),4, chg_str_n },

  66. { CHG(business_type),3, chg_str_n },

  67. { CHG(point_of_service_entry_mode),3, chg_str_n },

  68. { CHG(point_of_service_PIN_capture_code),2, chg_str_n },



  69. { CHG(fee_of_transaction),8, chg_double_n },

  70. { CHG(fee_of_kick_back),8, chg_double_xn },

  71. { CHG(acquiring_institution_id_code),11, chg_str_llvar },

  72. { CHG(forwarding_institution_id_code),11, chg_str_llvar },



  73. { CHG(track_2_data),37, chg_str_llvar },

  74. { CHG(track_3_data),104,chg_str_lllvar },

  75. { CHG(retrieval_reference_number),12, chg_str_n },

  76. { CHG(auth_id_response),6, chg_str_n },

  77. { CHG(response_code),2, chg_str_n },

  78. { CHG(card_acceptor_terminal_id),8, chg_str_n },

  79. { CHG(card_acceptor_id_code),15, chg_str_n },

  80. { CHG(card_acceptor_name_location),40, chg_str_n },

  81. { CHG(additional_response_data),25, chg_str_llvar },

  82. { CHG(broadcast_message),999,chg_str_lllvar },

  83. { CHG(currency_code_of_transaction),3, chg_str_n },

  84. { CHG(currency_code_of_settlement),3, chg_str_n },

  85. { CHG(PIN),64, chg_bit_bit },

  86. { CHG(security_ctrl_info),16, chg_SecurityCtrlInfo_n },

  87. { CHG(balance_amount),43, chg_BalanceAmount_n },

  88. { CHG(second_account_number),19, chg_str_n },

  89. { CHG(message_indicator),5, chg_MessageIndicator_lllvar},

  90. { CHG(auth_operation_code), 22,chg_AuthOperationCode_lllvar},



  91. { CHG(auth_agent_institution_id_code),11, chg_str_lllvar },



  92. { CHG(destination_institution_id_code),11, chg_str_lllvar },



  93. { CHG(MAC64),64, chg_bit_bit},

  94. { CHG(settlement_code),1, chg_char_n },

  95. { CHG(network_management_information_code),3, chg_str_n },



  96. { CHG(date_of_action),6, chg_str_n },

  97. { CHG(number_of_credits),10, chg_long_n },

  98. { CHG(reversal_number_of_credits),10, chg_long_n },

  99. { CHG(number_of_debits),10, chg_long_n },

  100. { CHG(reversal_number_of_debits),10, chg_long_n },

  101. { CHG(number_of_transfer),10, chg_long_n },

  102. { CHG(reversal_number_of_transfer),10, chg_long_n },

  103. { CHG(number_of_inquiries),10, chg_long_n },

  104. { CHG(number_of_authorizations),10, chg_long_n },

  105. { CHG(processing_fee_amount_of_credits),12, chg_double_n },



  106. { CHG(processing_fee_amount_of_debits),12, chg_double_n },



  107. { CHG(amount_of_credits),16, chg_double_n },

  108. { CHG(reversal_amount_of_credits),16, chg_double_n },

  109. { CHG(amount_of_debits),16, chg_double_n },

  110. { CHG(reversal_amount_of_debits),16, chg_double_n },

  111. { CHG(original_data_elements),42, chg_OriginalDataElements_n},

  112. { CHG(replacement_amounts),42, chg_ReplacementAmounts_n },



  113. { CHG(message_security_code),64, chg_bit_bit },

  114. { CHG(amount_of_net_settlement),16, chg_double_xn },

  115. { CHG(settlement_institution_id_code),11, chg_str_llvar },



  116. { CHG(receiveing_institution_id_code),11, chg_str_llvar },



  117. { CHG(trans_rem),100,chg_str_lllvar },

  118. { CHG(sender_institution_id_code),11, chg_str_lllvar },

  119. { CHG(sender_reference_number),12, chg_long_lllvar },

  120. { CHG(pid_no),15, chg_str_lllvar },

  121. { CHG(operator),16, chg_str_lllvar },

  122. { CHG(checker),16, chg_str_lllvar },

  123. { CHG(add_auth_id_response),13, chg_str_lllvar },

  124. { CHG(MAC),64, chg_bit_bit},

  125. { 0,0,0,0,NULL}

  126. };

  127. static int chg_move(int chg,void *value,

  128. int size,char *buf,int bufLen,int *bufUse)

  129. {

  130. if (*bufUse+size>;bufLen)

  131. return(-1);

  132. switch(chg)

  133. {

  134. case CHG_HTOS:

  135. memcpy(buf+*bufUse,value,size);break;

  136. case CHG_STOH:

  137. memcpy(value,buf+*bufUse,size);break;

  138. default:

  139. return(-1);

  140. };

  141. *bufUse=*bufUse+size;

  142. return(0);

  143. }

  144. static int chg_str_move(int chg,void *value,

  145. int size,char *buf,int bufLen,int *bufUse)

  146. {

  147. intlen;

  148. switch(chg)

  149. {

  150. case CHG_HTOS:

  151. len=strlen((char *)value);

  152. if ((len>;size)||(*bufUse+len>;bufLen))

  153. return(-1);

  154. strcpy(buf+*bufUse,(char *)value);

  155. *bufUse=*bufUse+len+1;

  156. break;

  157. case CHG_STOH:

  158. len=strlen(buf+*bufUse);

  159. if ((len>;size)||(*bufUse+len>;bufLen))

  160. return(-1);

  161. strcpy((char *)value,buf+*bufUse);

  162. *bufUse=*bufUse+len+1;

  163. break;

  164. default:

  165. return(-1);

  166. };

  167. return(0);

  168. }

  169. static int chg_char_n(int chg,void *value,

  170. int size,char *buf,int bufLen,int *bufUse)

  171. {

  172. switch(chg)

  173. {

  174. case CHG_HTON:

  175. if (*bufUse+size>;bufLen)

  176. return(-1);

  177. memcpy(buf+*bufUse,value,size);

  178. *bufUse=*bufUse+size;

  179. break;

  180. case CHG_NTOH:

  181. if (*bufUse+size>;bufLen)

  182. return(-1);

  183. memcpy(value,buf+*bufUse,size);

  184. *bufUse=*bufUse+size;

  185. break;

  186. case CHG_HTOS:

  187. case CHG_STOH:

  188. return(chg_move(chg,value,size,buf,bufLen,bufUse));

  189. default:

  190. return(-1);

  191. };

  192. return(0);

  193. }

  194. static int chg_str_n(int chg,void *value,

  195. int size,char *buf,int bufLen,int *bufUse)

  196. {

  197. intlen,i;

  198. switch(chg)

  199. {

  200. case CHG_HTON:

  201. if (*bufUse+size>;bufLen)

  202. return(-1);

  203. len=strlen((char *)value);

  204. strncpy(buf+*bufUse,(char *)value,size);

  205. if (len<size)

  206. memset(buf+*bufUse+len,' ',size-len);

  207. *bufUse=*bufUse+size;

  208. break;

  209. case CHG_NTOH:

  210. if (*bufUse+size>;bufLen)

  211. return(-1);

  212. strncpy((char *)value,buf+*bufUse,size);

  213. ((char *)value)[size]='\0';

  214. for(i=size-1; i>;0&&(((char *)value)==' '); --i)



  215. ((char *)value)='\0';

  216. *bufUse=*bufUse+size;

  217. break;

  218. case CHG_HTOS:

  219. case CHG_STOH:

  220. return(chg_str_move(chg,value,size,buf,bufLen,bufUse));

  221. default:

  222. return(-1);

  223. };

  224. return(0);

  225. }

  226. static int chg_str_llvar(int chg,void *value,

  227. int size,char *buf,int bufLen,int *bufUse)

  228. {

  229. inti,len;

  230. char*s;

  231. charc1,c2;

  232. s=(char *)value;

  233. switch(chg)

  234. {

  235. case CHG_HTON:

  236. len=strlen(s);

  237. if ((len>;99)||(len>;size)||(*bufUse+len+2>;bufLen))

  238. return(-1);

  239. buf[*bufUse]=(char)('0'+len/10);

  240. buf[*bufUse+1]=(char)('0'+len%10);

  241. if (len>;0)

  242. strncpy(buf+*bufUse+2,s,len);

  243. *bufUse=*bufUse+2+len;

  244. break;

  245. case CHG_NTOH:

  246. if (*bufUse+2>;bufLen)

  247. return(-1);

  248. c1=buf[*bufUse];

  249. c2=buf[*bufUse+1];

  250. if ((c1<'0')||(c1>;'9')||(c2<'0')||(c2>;'9'))

  251. return(-1);

  252. len=(c1-'0')*10+(c2-'0');

  253. if (*bufUse+2+len>;bufLen)

  254. return(-1);

  255. if (len>;0)

  256. memcpy(s,buf+*bufUse+2,len);

  257. s[len]='\0';

  258. *bufUse=*bufUse+2+len;

  259. break;

  260. case CHG_HTOS:

  261. case CHG_STOH:

  262. return(chg_str_move(chg,value,size,buf,bufLen,bufUse));

  263. default:

  264. return(-1);

  265. };

  266. return(0);

  267. }

  268. static int chg_str_lllvar(int chg,void *value,

  269. int size,char *buf,int bufLen,int *bufUse)

  270. {

  271. inti,len;

  272. char*s;

  273. charc1,c2,c3;

  274. s=(char *)value;

  275. switch(chg)

  276. {

  277. case CHG_HTON:

  278. len=strlen(s);

  279. if ((len>;999)||(len>;size)||(*bufUse+len+3>;bufLen))

  280. return(-1);

  281. buf[*bufUse]=(char)('0'+len/100);

  282. buf[*bufUse+1]=(char)('0'+(len%100)/10);

  283. buf[*bufUse+2]=(char)('0'+len%10);

  284. if (len>;0)

  285. strncpy(buf+*bufUse+3,s,len);

  286. *bufUse=*bufUse+3+len;

  287. break;

  288. case CHG_NTOH:

  289. if (*bufUse+2>;bufLen)

  290. return(-1);

  291. c1=buf[*bufUse];

  292. c2=buf[*bufUse+1];

  293. c3=buf[*bufUse+2];

  294. if ((c1<'0')||(c1>;'9')

  295. ||(c2<'0')||(c2>;'9')

  296. ||(c3<'0')||(c3>;'9'))

  297. return(-1);

  298. len=(c1-'0')*100+(c2-'0')*10+(c3-'0');

  299. if (*bufUse+3+len>;bufLen)

  300. return(-1);

  301. if (len>;0)

  302. memcpy(s,buf+*bufUse+3,len);

  303. s[len]='\0';

  304. *bufUse=*bufUse+3+len;

  305. break;

  306. case CHG_HTOS:

  307. case CHG_STOH:

  308. return(chg_str_move(chg,value,size,buf,bufLen,bufUse));

  309. default:

  310. return(-1);

  311. };

  312. return(0);

  313. }

  314. static int chg_bit_bit(int chg,void *value,

  315. int size,char *buf,int bufLen,int *bufUse)

  316. {

  317. switch(chg)

  318. {

  319. case CHG_HTON:

  320. if (*bufUse+size/8>;bufLen)

  321. return(-1);

  322. memcpy(buf+*bufUse,value,size/8);

  323. *bufUse=*bufUse+size/8;

  324. break;

  325. case CHG_NTOH:

  326. if (*bufUse+size/8>;bufLen)

  327. return(-1);

  328. memcpy(value,buf+*bufUse,size/8);

  329. *bufUse=*bufUse+size/8;

  330. break;

  331. case CHG_HTOS:

  332. case CHG_STOH:

  333. return(chg_move(chg,value,size/8,buf,bufLen,bufUse));

  334. default:

  335. return(-1);

  336. };

  337. return(0);

  338. }

  339. static int chg_long_n(int chg,void *value,

  340. int size,char *buf,int bufLen,int *bufUse)

  341. {

  342. unsigned long*v;

  343. chars[32];

  344. intlen;

  345. charformat[16];

  346. v=(unsigned long *)value;

  347. switch(chg)

  348. {

  349. case CHG_HTON:

  350. if (*bufUse+size>;bufLen)

  351. return(-1);

  352. sprintf(format,"%%0%du",size);

  353. sprintf(s,format,*v);

  354. len=strlen(s);

  355. if (len!=size)

  356. return(-1);

  357. memcpy(buf+*bufUse,s,len);

  358. *bufUse=*bufUse+size;

  359. break;

  360. case CHG_NTOH:

  361. if (*bufUse+size>;bufLen)

  362. return(-1);

  363. if (size>;30)

  364. return(-1);

  365. memcpy(s,buf+*bufUse,size);

  366. s[size]='\0';

  367. if (sscanf(s,"%u",v)!=1)

  368. return(-1);

  369. *bufUse=*bufUse+size;

  370. break;

  371. case CHG_HTOS:

  372. case CHG_STOH:

  373. return(chg_move(chg,value,sizeof(long),buf,bufLen,bufUse));

  374. default:

  375. return(-1);

  376. };

  377. return(0);

  378. }

  379. static int chg_long_lllvar(int chg,void *value,

  380. int size,char *buf,int bufLen,int *bufUse)

  381. {

  382. unsigned long*v;

  383. chars[32];

  384. intlen;

  385. charformat[16];

  386. v=(unsigned long *)value;

  387. switch(chg)

  388. {

  389. case CHG_HTON:

  390. if (*bufUse+size+3>;bufLen)

  391. return(-1);

  392. sprintf(s,"%u",*v);

  393. len=strlen(s);

  394. if (len>;size)

  395. return(-1);

  396. buf[*bufUse]='0'+(char)(len/100);

  397. buf[*bufUse+1]='0'+(char)((len%100)/10);

  398. buf[*bufUse+2]='0'+(char)(len%10);

  399. memcpy(buf+(*bufUse)+3,s,len);

  400. *bufUse=*bufUse+len+3;

  401. break;

  402. case CHG_NTOH:

  403. if (*bufUse+3>;bufLen)

  404. return(-1);

  405. if (buf[*bufUse]<'0'||buf[*bufUse]>;'9'

  406. ||buf[*bufUse+1]<'0'||buf[*bufUse+1]>;'9'

  407. ||buf[*bufUse+2]<'0'||buf[*bufUse+2]>;'9')

  408. return(-1);

  409. len=(buf[*bufUse]-'0')*100+(buf[*bufUse+1]-'0')

  410. +(buf[*bufUse+2]-'0');

  411. if (len>;size)

  412. return(-1);

  413. if (*bufUse+len+3>;bufLen)

  414. return(-1);

  415. if (len>;30)

  416. return(-1);

  417. memcpy(s,buf+*bufUse+3,len);

  418. s[len]='\0';

  419. if (sscanf(s,"%u",v)!=1)

  420. return(-1);

  421. *bufUse=*bufUse+3+len;

  422. break;

  423. case CHG_HTOS:

  424. case CHG_STOH:

  425. return(chg_move(chg,value,sizeof(long),buf,bufLen,bufUse));

  426. default:

  427. return(-1);

  428. };

  429. return(0);

  430. }

  431. static void del_dot(char *s)

  432. {

  433. inti=0;

  434. intd=0;

  435. while(s!='\0')

  436. {

  437. if (s=='.')

  438. d=1;

  439. if (d)

  440. s=s[i+1];

  441. ++i;

  442. };

  443. }

  444. static int add_dot(char *s)

  445. {

  446. intlen;

  447. inti;

  448. i=0;

  449. while(s==' ')

  450. ++i;

  451. if (i!=0)

  452. strcpy(s,s+i);

  453. len=strlen(s);

  454. if (len<2)

  455. return(-1);

  456. for(i=0; i<len; ++i)

  457. if (s<'0'||s>;'9')

  458. return(-1);

  459. s[len+1]='\0';

  460. s[len] =s[len-1];

  461. s[len-1]=s[len-2];

  462. s[len-2]='.';

  463. return(0);

  464. }

  465. static int chg_double_n(int chg,void *value,

  466. int size,char *buf,int bufLen,int *bufUse)

  467. {

  468. double*v;

  469. chars[64];

  470. intlen;

  471. charformat[16];

  472. v=(double *)value;

  473. switch(chg)

  474. {

  475. case CHG_HTON:

  476. if (*bufUse+size>;bufLen)

  477. return(-1);

  478. if (*v<0)

  479. return(-1);

  480. sprintf(format,"%%0%d.2lf",size+1);

  481. sprintf(s,format,*v);

  482. del_dot(s);

  483. len=strlen(s);

  484. if (len!=size)

  485. return(-1);

  486. memcpy(buf+*bufUse,s,len);

  487. *bufUse=*bufUse+size;

  488. break;

  489. case CHG_NTOH:

  490. if (*bufUse+size>;bufLen)

  491. return(-1);

  492. if (size>;60)

  493. return(-1);

  494. memcpy(s,buf+*bufUse,size);

  495. s[size]='\0';

  496. if (add_dot(s)!=0)

  497. return(-1);

  498. if (sscanf(s,"%lf",v)!=1)

  499. return(-1);

  500. *bufUse=*bufUse+size;

  501. break;

  502. case CHG_HTOS:

  503. case CHG_STOH:

  504. return(chg_move(chg,value,sizeof(double),buf,bufLen,bufUse));

  505. default:

  506. return(-1);

  507. };

  508. return(0);

  509. }

  510. static int chg_double_xn(int chg,void *value,

  511. int size,char *buf,int bufLen,int *bufUse)

  512. {

  513. doublev;

  514. intr;

  515. charx;

  516. switch(chg)

  517. {

  518. case CHG_HTON:

  519. if (*bufUse+size+1>;bufLen)

  520. return(-1);

  521. v=*(double *)value;

  522. if (v==0)

  523. *(buf+*bufUse)='0';

  524. else if (v>;0)

  525. *(buf+*bufUse)=CHAR_CREDIT;

  526. else

  527. {

  528. *(buf+*bufUse)=CHAR_DEBIT;

  529. v=-v;

  530. };

  531. *bufUse=*bufUse+1;

  532. r=chg_double_n(chg,(void *)&v,

  533. size,buf,bufLen,bufUse);

  534. break;

  535. case CHG_NTOH:

  536. if (*bufUse+size+1>;bufLen)

  537. return(-1);

  538. x=*(buf+*bufUse);

  539. if (x!='0'&&x!=CHAR_CREDIT&&x!=CHAR_DEBIT)

  540. return(-1);

  541. *bufUse=*bufUse+1;

  542. r=chg_double_n(chg,(void *)&v,

  543. size,buf,bufLen,bufUse);

  544. if (r!=0)

  545. return(r);

  546. if (x=='0')

  547. {

  548. if (v!=0)

  549. return(-1);

  550. *(double *)value=0;

  551. }

  552. else if (x==CHAR_CREDIT)

  553. *(double *)value=v;

  554. else *(double *)value=-v;

  555. r=0;

  556. break;

  557. case CHG_HTOS:

  558. case CHG_STOH:

  559. return(chg_move(chg,value,sizeof(double),buf,bufLen,bufUse));

  560. default:

  561. r=-1;

  562. };

  563. return(r);

  564. }

  565. static int chg_SecurityCtrlInfo_n(int chg,void *value,



  566. int size,char *buf,int bufLen,int *bufUse)

  567. {

  568. intr;

  569. AB8583_Security_Ctrl_Info *p;

  570. if (chg==CHG_HTOS||chg==CHG_STOH)

  571. return(chg_move(chg,value,sizeof(AB8583_Security_Ctrl_Info),

  572. buf,bufLen,bufUse));

  573. if ((size!=16)

  574. ||(*bufUse+size>;bufLen))

  575. return(-1);

  576. p=(AB8583_Security_Ctrl_Info *)value;

  577. r=chg_long_n(chg,(void *)&p->;sync_counter,

  578. 8,buf,bufLen,bufUse);

  579. if (r!=0)

  580. goto E;

  581. r=chg_str_n(chg,(void *)&p->;reserved,

  582. 7,buf,bufLen,bufUse);

  583. if (r!=0)

  584. goto E;

  585. r=chg_char_n(chg,(void *)&p->;key_type,

  586. 1,buf,bufLen,bufUse);

  587. E:

  588. return(r);

  589. }

  590. static int chg_BalanceAmountItem_n(int chg,

  591. AB8583_Balance_Amount_Item *p,

  592. int size,char *buf,int bufLen,int *bufUse)

  593. {

  594. intr;

  595. if ((size!=20)

  596. ||(*bufUse+size>;bufLen))

  597. return(-1);

  598. r=chg_str_n(chg,(void *)&p->;account_type,

  599. 2,buf,bufLen,bufUse);

  600. if (r!=0)

  601. goto E;

  602. r=chg_str_n(chg,(void *)&p->;amount_type,

  603. 2,buf,bufLen,bufUse);

  604. if (r!=0)

  605. goto E;

  606. r=chg_str_n(chg,(void *)&p->;currency_code,

  607. 3,buf,bufLen,bufUse);

  608. if (r!=0)

  609. goto E;

  610. r=chg_double_xn(chg,(void *)&p->;amount,

  611. 12,buf,bufLen,bufUse);

  612. if (r!=0)

  613. goto E;

  614. E:

  615. return(r);

  616. }

  617. static int chg_BalanceAmount_n(int chg,void *value,

  618. int size,char *buf,int bufLen,int *bufUse)

  619. {

  620. intr;

  621. AB8583_Balance_Amount*p;

  622. charlength[4];

  623. if (chg==CHG_HTOS||chg==CHG_STOH)

  624. return(chg_move(chg,value,sizeof(AB8583_Balance_Amount),

  625. buf,bufLen,bufUse));

  626. if ((size!=43)

  627. ||(*bufUse+size>;bufLen))

  628. return(-1);

  629. p=(AB8583_Balance_Amount *)value;

  630. switch(chg)

  631. {

  632. case CHG_HTON:

  633. strcpy(length,"040");

  634. r=chg_str_n(chg,length,

  635. 3,buf,bufLen,bufUse);

  636. if (r!=0)

  637. goto E;

  638. break;

  639. case CHG_NTOH:

  640. r=chg_str_n(chg,p->;length,

  641. 3,buf,bufLen,bufUse);

  642. if (r!=0)

  643. goto E;

  644. if (strcmp(p->;length,"040")!=0)

  645. {r=-1;

  646. goto E;

  647. };

  648. break;

  649. default:

  650. r=-1;

  651. goto E;

  652. };

  653. r=chg_BalanceAmountItem_n(chg,&p->;ledger_balance,

  654. 20,buf,bufLen,bufUse);

  655. if (r!=0)

  656. goto E;

  657. r=chg_BalanceAmountItem_n(chg,&p->;available_balance,

  658. 20,buf,bufLen,bufUse);

  659. E:

  660. return(r);

  661. }

  662. static int chg_MessageIndicator_lllvar(int chg,void *value,



  663. int size,char *buf,int bufLen,int *bufUse)

  664. {

  665. intr;

  666. AB8583_Message_Indicator*p;

  667. charlength[4];

  668. if (chg==CHG_HTOS||chg==CHG_STOH)

  669. return(chg_move(chg,value,sizeof(AB8583_Message_Indicator),

  670. buf,bufLen,bufUse));

  671. if ((size!=5)

  672. ||(*bufUse+size>;bufLen))

  673. return(-1);

  674. p=(AB8583_Message_Indicator *)value;

  675. switch(chg)

  676. {

  677. case CHG_HTON:

  678. strcpy(length,"005");

  679. r=chg_str_n(chg,length,

  680. 3,buf,bufLen,bufUse);

  681. if (r!=0)

  682. goto E;

  683. break;

  684. case CHG_NTOH:

  685. r=chg_str_n(chg,length,

  686. 3,buf,bufLen,bufUse);

  687. if (r!=0)

  688. goto E;

  689. if (strcmp(length,"005")!=0)

  690. {r=-1;

  691. goto E;

  692. };

  693. break;

  694. default:

  695. r=-1;

  696. goto E;

  697. };

  698. r=chg_char_n(chg,(void *)&p->;encryption_key_used,

  699. 1,buf,bufLen,bufUse);

  700. if (r!=0)

  701. goto E;

  702. r=chg_char_n(chg,(void *)&p->;mac_key_used,

  703. 1,buf,bufLen,bufUse);

  704. if (r!=0)

  705. goto E;

  706. r=chg_char_n(chg,(void *)&p->;message_effect,

  707. 1,buf,bufLen,bufUse);

  708. if (r!=0)

  709. goto E;

  710. r=chg_str_n(chg,(void *)&p->;no_of_unlogged_txns,

  711. 2,buf,bufLen,bufUse);

  712. E:

  713. return(r);

  714. }

  715. static int chg_AuthOperationCode_lllvar(int chg,void *value,



  716. int size,char *buf,int bufLen,int *bufUse)

  717. {

  718. intr;

  719. AB8583_Auth_Operation_Code*p;

  720. charlength[4];

  721. if (chg==CHG_HTOS||chg==CHG_STOH)

  722. return(chg_move(chg,value,sizeof(AB8583_Auth_Operation_Code),

  723. buf,bufLen,bufUse));

  724. if ((size!=22)

  725. ||(*bufUse+size+3>;bufLen))

  726. return(-1);

  727. p=(AB8583_Auth_Operation_Code *)value;

  728. switch(chg)

  729. {

  730. case CHG_HTON:

  731. strcpy(length,"022");

  732. r=chg_str_n(chg,length,

  733. 3,buf,bufLen,bufUse);

  734. if (r!=0)

  735. goto E;

  736. break;

  737. case CHG_NTOH:

  738. r=chg_str_n(chg,length,

  739. 3,buf,bufLen,bufUse);

  740. if (r!=0)

  741. goto E;

  742. if (strcmp(length,"022")!=0)

  743. {r=-1;

  744. goto E;

  745. };

  746. break;

  747. default:

  748. r=-1;

  749. goto E;

  750. };

  751. r=chg_char_n(chg,(void *)&p->;auth_function_code,

  752. 1,buf,bufLen,bufUse);

  753. if (r!=0)

  754. goto E;

  755. r=chg_char_n(chg,(void *)&p->;auth_mode,

  756. 1,buf,bufLen,bufUse);

  757. if (r!=0)

  758. goto E;

  759. r=chg_str_n(chg,(void *)&p->;auth_id_response_code,

  760. 6,buf,bufLen,bufUse);

  761. if (r!=0)

  762. goto E;

  763. r=chg_str_n(chg,(void *)&p->;service_business_code,

  764. 4,buf,bufLen,bufUse);

  765. if (r!=0)

  766. goto E;

  767. r=chg_str_n(chg,(void *)&p->;invoice_number,

  768. 10,buf,bufLen,bufUse);

  769. E:

  770. return(r);

  771. }

  772. static int chg_OriginalDataElements_n(int chg,void *value,



  773. int size,char *buf,int bufLen,int *bufUse)

  774. {

  775. intr;

  776. AB8583_Original_Data_Elements*p;

  777. if (chg==CHG_HTOS||chg==CHG_STOH)

  778. return(chg_move(chg,value,sizeof(AB8583_Original_Data_Elements),

  779. buf,bufLen,bufUse));

  780. if ((size!=42)

  781. ||(*bufUse+size>;bufLen))

  782. return(-1);

  783. p=(AB8583_Original_Data_Elements *)value;

  784. r=chg_str_n(chg,(void *)&p->;org_message_type,

  785. 4,buf,bufLen,bufUse);

  786. if (r!=0)

  787. goto E;

  788. r=chg_str_n(chg,(void *)&p->;org_system_trace_number,

  789. 6,buf,bufLen,bufUse);

  790. if (r!=0)

  791. goto E;

  792. r=chg_str_n(chg,(void *)&p->;org_transaction_date_time,

  793. 10,buf,bufLen,bufUse);

  794. if (r!=0)

  795. goto E;

  796. r=chg_str_n(chg,(void *)&p->;org_acqr_inst_id_code,

  797. 11,buf,bufLen,bufUse);

  798. if (r!=0)

  799. goto E;

  800. r=chg_str_n(chg,(void *)&p->;org_forw_inst_id_code,

  801. 11,buf,bufLen,bufUse);

  802. E:

  803. return(r);

  804. }

  805. static int chg_ReplacementAmounts_n(int chg,void *value,



  806. int size,char *buf,int bufLen,int *bufUse)

  807. {

  808. intr;

  809. AB8583_Replacement_Amounts*p;

  810. if (chg==CHG_HTOS||chg==CHG_STOH)

  811. return(chg_move(chg,value,sizeof(AB8583_Replacement_Amounts),

  812. buf,bufLen,bufUse));

  813. if ((size!=42)

  814. ||(*bufUse+size>;bufLen))

  815. return(-1);

  816. p=(AB8583_Replacement_Amounts *)value;

  817. r=chg_double_n(chg,&p->;actual_amount_of_transaction,

  818. 12,buf,bufLen,bufUse);

  819. if (r!=0)

  820. goto E;

  821. r=chg_double_n(chg,&p->;actual_amount_of_settlement,

  822. 12,buf,bufLen,bufUse);

  823. if (r!=0)

  824. goto E;

  825. r=chg_double_xn(chg,&p->;actual_amount_of_transaction_fee,

  826. 8,buf,bufLen,bufUse);

  827. if (r!=0)

  828. goto E;

  829. r=chg_double_xn(chg,&p->;actual_amount_of_settlement_fee,

  830. 8,buf,bufLen,bufUse);

  831. E:

  832. return(r);

  833. }

  834. /************************ HTON or NTOH *********************/



  835. static int chg_AB8583_n(int chg,AB8583 *data,

  836. char *buf,int bufLen,int *bufUse,int *lastField)

  837. {

  838. intr,i;

  839. r=chg_str_n(chg,&data->;message_type,

  840. 4,buf,bufLen,bufUse);

  841. if (r!=0)

  842. goto E;

  843. r=chg_bit_bit(chg,&data->;primary_bitmap,

  844. 64,buf,bufLen,bufUse);

  845. if (r!=0)

  846. goto E;

  847. for(i=0, r=0; (r==0)&&(chgList.bitName!=0); ++i)

  848. if (AB8583_bitIsSet(data,chgList.bitName))

  849. {

  850. *lastField=chgList.bitName;

  851. r=(*chgList.chgF)(chg,

  852. ((char *)data)+chgList.offset,

  853. chgList.size,

  854. buf,bufLen,bufUse);

  855. };

  856. E:

  857. return(r);

  858. }

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



  860. {

  861. intr;

  862. *bufUse=0;

  863. *lastField=0;

  864. r=chg_AB8583_n(CHG_HTON,data,buf,bufLen,bufUse,lastField);

  865. return(r);

  866. }

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



  868. {

  869. intr;

  870. AB8583_clear(data);

  871. *bufUse=0;

  872. *lastField=0;

  873. r=chg_AB8583_n(CHG_NTOH,data,buf,bufLen,bufUse,lastField);

  874. return(r);

  875. }

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



  877. {

  878. intr;

  879. *bufUse=0;

  880. *lastField=0;

  881. r=chg_AB8583_n(CHG_HTOS,data,buf,bufLen,bufUse,lastField);

  882. return(r);

  883. }

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



  885. {

  886. intr;

  887. AB8583_clear(data);

  888. *bufUse=0;

  889. *lastField=0;

  890. r=chg_AB8583_n(CHG_STOH,data,buf,bufLen,bufUse,lastField);

  891. return(r);

  892. }

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



  894. {

  895. int i;

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

  897. if(chgList.bitName==0) return(-1);

  898. memcpy((char *)outdata+chgList.offset,

  899. (char *)indata+chgList.offset,chgList.valsize);

  900. if(AB8583_setBit(outdata,BitNum)!=0) return(-1);

  901. return(0);

  902. }

 




阅读(4653) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:GetMemory指针传参经典实例

给主人留下些什么吧!~~