你会发现:
1、定长无分隔符报文最不灵活,没有文档双方无法交换信息(因为你无法理解其中有几个字段、是什么字段),很浪费存储和网络传输的带宽;
2、CSV、PSV之类的节约了存储和网络传输的带宽,但也很不灵活,例如你要加个字段,双方可能要改N个程序;
3、.INI、Json、XML等越来越灵活,但也越来越复杂,也非常浪费存储和网络传输的带宽。
所以在早期银行卡交易的领域,例如ATM机与后台的交易报文,ATM 往往是通过电话拨号建立网络的,速率可能只有2400 bit/s,此时节约带宽是非常重要的,如何设计一个通用的、扩展性比较强的、灵活的、报文又短从而节约带宽的报文交换协议,是个挺有挑战性的课题。
其实在银行卡交易的领域,常用的字段无非是 账号/卡号、交易金额、密码、行号等,
例如你在ATM上取100元,报文需要有这些元素:卡号=1234567890,交易动作=取款,金额=100.00,密码=888888
你在ATM上转账给王五200元,报文需要有这些元素:转出卡号=1234567890,交易动作=转账,金额=200.00,密码=888888,转入卡号=555555555,收款人=王五
如果你设计的报文就像我上面写的:Field1=Value1,Field2=Value2,......
可不可以?当然可以,不过这种Field-Value对与CSV结合的格式虽然很灵活,但是字段名还是很浪费带宽。
ISO 8583 标准的制定者很聪明,他把常用字段用编号规定,例如:
2#字段(Field,也翻译成“域”):账号/卡号,由于各银行的账号/卡号长度不一,因此定义成变长域,在账号/卡号前放一个2位数字表示长度,例如卡号8866123422345678长16位,在报文中可以这样表示:168866123422345678
3#域:处理码,用6位数字表示各种交易类型,如ATM取款、存款、转账等
4#域:交易金额,定长域,无小数点,在我国一般定义其单位为分
......
52#域:密码(密文)
......
64#域:报文验证码(MAC),报文接收者可用来验证该报文是否在传输途中被人篡改。
......
128#域:报文验证码(MAC),报文接收者可用来验证该报文是否在传输途中被人篡改。
然后他再定义128个比特,128/8=16个字节,每个比特他从左到右进行编号,即1到128,用来表示在报文中对应的几号(#)字段是否出现,这16个字节就叫做BITMAP。为了更加节约,他把这16个字节的BITMAP分为前8个字节和后8个字节,分别叫基本的BITMAP和扩展的BITMAP,分别对应2-64#域和65-128#域,而扩展的BITMAP被定义为1#字段。如果某个交易只用到最常用的域,即2-64#中的某些域,就没必要出现扩展的BITMAP的8字节,报文就节约了8字节。
因为每个域都规定了是定长还是变长,变长的域都有长度字节表示,因此在报文中各域的内容间是无分隔符的,节约了带宽。
以前面的在ATM上取100元的报文作为例子,
报文元素:卡号=1234567890,交易动作=取款,金额=100.00,密码=888888
假设不考虑ATM机编号、ATM机交易时间、流水号、银行号、报文验证码(MAC)等域,
则ISO 8583 的报文域:
1#:Extend BitMap,无
2#:账号/卡号,2位变长,值为101234567890
3#:处理码,ATM取款的值为010000
4#:交易金额,12位定长,100元的值表示为000000000100
52#:密码(密文),假设密码888888加密后为 @ $!^*%~
这样报文只有2、3、4、52#域,基本的BITMAP的64比特就是这样:
01110000 00000000 00000000 00000000 00000000 00000000 00010000 00000000
写成16进制就是:
70 00 00 00 00 00 10 00
整个8583标准的报文用C语言的字符串表示就像这样:
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 101234567890010000000000000100@ $!^*%~
你看,8583格式的报文是不是非常短?虽然没有分隔符,但是只要双方都知道按ISO 8583标准来定义,程序还是可以很容易写一个通用的。
由于BITMAP的概念,它变得很灵活。如果你要使用的字段ISO 8583标准未定义,你还可以使用“保留给民间使用”的62#、63#等变长域,其中你可以与通讯的对方约定子域,子域是定长还是变长,或者是XML格式,都可以由双方来约定,这样在标准之外,还可以有相当的灵活性。
ISO8583标准有1987版、1993版、2003版,前2个版本的变长域最长是999,而2003版的部分变长域最长允许9999。
因此ATM取款即使要用你的指纹来验证,把指纹信息放到ISO 8583报文中也是毫无问题的。
ISO8583 ISO8583_1993[] =
{
0, Bit Map , 位元表 , , 0, FT_B , 8,
1, Bit Map/Extended , 扩展位元表 , , 0, FT_B , 8,
2, Primary Account Number , 主帐号 , LLVAR , 2, FT_N , 19,
3, Processing Code , 处理代码 , , 0, FT_N , 6,
4, Amount, Transaction , 交易金额 , , 0, FT_N , 12,
5, Amount, Reconciliation , 对帐金额 , , 0, FT_N , 12,
6, Amount, Cardholder Billing , 持卡人签单金额 , , 0, FT_N , 12,
7, Date and Time, Transmission , 传输日期和时间 , MMDDhhmmss , 0, FT_N , 10,
8, Amount, Cardholder Billing Fee , 持卡人签单手续费金额 , , 0, FT_N , 8,
9, Conversion Rate, Reconciliation , 对帐兑换率 , , 0, FT_N , 8,
10, Conversion Rate, Cardholder Billing , 持卡人签单兑换率 , , 0, FT_N , 8,
11, Systems Trace Audit Number , 系统跟踪审计号 , , 0, FT_N , 6,
12, Date and Time, Local Transaction , 本地交易日期时间 , YYMMDDhhmmss , 0, FT_N , 12,
13, Date, Effective , 生效日期 , YYMM , 0, FT_N , 4,
14, Date, Expiration , 截止日期 , YYMM , 0, FT_N , 4,
15, Date, Settlement , 清算日期 , YYMMDD , 0, FT_N , 6,
16, Date, Conversion , 兑换日期 , MMDD , 0, FT_N , 4,
17, Date, Capture , 受理日期 , MMDD , 0, FT_N , 4,
18, Merchant Type , 商户类型 , , 0, FT_N , 4,
19, Country Code, Acquiring Institution , 代理机构国家代码 , , 0, FT_N , 3,
20, Country Code, Primary Account Number , 主帐号国家代码 , , 0, FT_N , 3,
21, Country Code, Forwarding Institution , 发送机构国家代码 , , 0, FT_N , 3,
22, Point of Service Data Code , 服务点数据代码 , , 0, FT_AN , 12,
23, Card Sequence Number , 卡顺序号 , , 0, FT_N , 3,
24, Function Code , 功能代码 , , 0, FT_N , 3,
25, Message Reason Code , 报文理由代码 , , 0, FT_N , 4,
26, Card Acceptor Business Code , 受卡方业务代码 , , 0, FT_N , 4,
27, Approval Code Length , 批准代码长度 , , 0, FT_N , 1,
28, Date, Reconciliation , 对帐日期 , YYMMDD , 0, FT_N , 6,
29, Reconciliation Indicator , 对帐指示符 , , 0, FT_N , 3,
30, Amounts, Original , 原始金额 , , 0, FT_N , 24,
31, Acquirer Reference Data , 代理方参考数据 , LLVAR , 2, FT_ANS , 99,
32, Acquirer Institution ID Code , 代理方机构标识码 , LLVAR , 2, FT_N , 11,
33, Forwarding Institution ID Code , 发送机构标识码 , LLVAR , 2, FT_N , 11,
34, Primary Account Number, Extended , 扩展的主帐号 , LLVAR , 2, FT_NS , 28,
35, Track 2 Data , 第二磁道数据 , LLVAR , 2, FT_Z , 37,
36, Track 3 Data , 第三磁道数据 , LLLVAR , 3, FT_Z , 104,
37, Retrieval Reference Number , 检索参考号 , , 0, FT_ANP , 12,
38, Approval Code , 批准代码 , , 0, FT_ANP , 6,
39, Action Code , 动作代码 , , 0, FT_N , 3,
40, Service Code , 服务代码 , , 0, FT_N , 3,
41, Card Acceptor Terminal ID , 受卡方终端标识 , , 0, FT_ANS , 8,
42, Card Acceptor ID Code , 受卡方标识代码 , , 0, FT_ANS , 15,
43, Card Acceptor Name/Location , 受卡方名称/地点 , LLVAR , 2, FT_ANS , 99,
44, Additional Response Data , 附加响应数据 , LLVAR , 2, FT_ANS , 99,
45, Track 1 Data , 第一磁道数据 , LLVAR , 2, FT_ANS , 76,
46, Amounts, Fees , 手续费金额 , LLLVAR , 3, FT_ANS , 204,
47, Additional Data - National , 附加数据-国家 , LLLVAR , 3, FT_ANS , 999,
48, Additional Data - Private , 附加数据-民间 , LLLVAR , 3, FT_ANS , 999,
49, Currency Code, Transaction , 交易货币代码 , , 0, FT_A , 3,
50, Currency Code, Reconciliation , 对帐货币代码 , , 0, FT_A , 3,
51, Currency Code, Cardholder Billing , 持卡人签单货币代码 , , 0, FT_A , 3,
52, Personal ID (PIN) Data , 用户密码PIN数据 , , 0, FT_B , 8,
53, Security Related Control Information , 安全控制信息 , LLVAR , 2, FT_B , 48,
54, Amounts, Additional , 附加金额 , LLLVAR , 3, FT_ANS , 120,
55, Integrated Circuit Card System Related Data , IC卡系统相关数据 , LLLVAR , 3, FT_B , 48,
56, Original Data Elements , 原始数据元 , LLVAR , 2, FT_N , 35,
57, Authorization Life Cycle Code , 授权生命周期代码 , , 0, FT_N , 3,
58, Authorizing Agent Institution ID Code , 授权代理机构标识代码 , LLVAR , 2, FT_N , 11,
59, Transport Data , 传输数据 , LLLVAR , 3, FT_ANS , 999,
60, Reserved for National Use , 保留给国家使用 , LLLVAR , 3, FT_ANS , 999,
61, Reserved for National Use , 保留给国家使用 , LLLVAR , 3, FT_ANS , 999,
62, Reserved for Private Use , 保留给民间使用 , LLLVAR , 3, FT_ANS , 999,
63, Reserved for Private Use , 保留给民间使用 , LLLVAR , 3, FT_ANS , 999,
64, Message Authentication Code Field , 报文鉴别代码字段 , , 0, FT_B , 8,
65, Reserved for ISO , 保留给ISO使用 , , 0, FT_B , 8,
66, Amounts, Original Fees , 原始手续费金额 , LLLVAR , 3, FT_ANS , 204,
67, Extended Payment Data , 扩展的付款数据 , , 0, FT_N , 2,
68, Country Code, Receiving Institution , 接收机构国家代码 , , 0, FT_N , 3,
69, Country Code, Settlement Institution , 清算机构国家代码 , , 0, FT_N , 3,
70, Country Code, Authorizing Agent Institution , 授权代理机构国家代码 , , 0, FT_N , 3,
71, Message Number , 报文编号 , , 0, FT_N , 8,
72, Data, Record , 数据记录 , LLLVAR , 3, FT_ANS , 999,
73, Date, Action , 动作日期 , YYMMDD , 0, FT_N , 6,
74, Credits, Number , 贷记笔数 , , 0, FT_N , 10,
75, Credits, Reversal Number , 撤消贷记笔数 , , 0, FT_N , 10,
76, Debits, Number , 借记笔数 , , 0, FT_N , 10,
77, Debits, Reversal Number , 撤消借记笔数 , , 0, FT_N , 10,
78, Transfer, Number , 转帐笔数 , , 0, FT_N , 10,
79, Transfer, Reversal Number , 撤消转帐笔数 , , 0, FT_N , 10,
80, Inquiries, Number , 查询笔数 , , 0, FT_N , 10,
81, Authorizations, Number , 授权笔数 , , 0, FT_N , 10,
82, Inquiries, Reversal Number , 撤消查询笔数 , , 0, FT_N , 10,
83, Payments, Number , 付款笔数 , , 0, FT_N , 10,
84, Payments, Reversal Number , 撤消付款笔数 , , 0, FT_N , 10,
85, Fee Collections, Number , 手续费收取笔数 , , 0, FT_N , 10,
86, Credits, Amount , 贷记金额 , , 0, FT_N , 16,
87, Credits, Reversal Amount , 撤消贷记金额 , , 0, FT_N , 16,
88, Debits, Amount , 借记金额 , , 0, FT_N , 16,
89, Debits, Reversal Amount , 撤消借记金额 , , 0, FT_N , 16,
90, Authorizations, Reversal Number , 撤消授权笔数 , , 0, FT_N , 10,
91, Country Code, Transaction Destination Institution , 交易终点机构国家代码 , , 0, FT_N , 3,
92, Country Code, Transaction Originator Institution , 交易发起机构国家代码 , , 0, FT_N , 3,
93, Transaction Destination Institution ID Code , 交易终点机构标识代码 , LLVAR , 2, FT_N , 11,
94, Transaction Originator Institution ID Code , 交易发起机构标识代码 , LLVAR , 2, FT_N , 11,
95, Card Issuer Reference Data , 发卡方参考数据 , LLVAR , 2, FT_ANS , 99,
96, Key Management Data , 密钥管理数据 , LLLVAR , 3, FT_B , 999,
97, Amount, Net Reconciliation , 净对帐金额 , , 0, FT_XN , 16,
98, Payee , 收款人 , , 0, FT_ANS , 25,
99, Settlement Institution ID Code , 清算机构标识代码 , LLVAR , 2, FT_AN , 11,
100, Receiving Institution ID Code , 接收机构标识代码 , LLVAR , 2, FT_AN , 11,
101, File Name , 文件名 , LLVAR , 2, FT_ANS , 17,
102, Account ID 1 , 帐户标识1 , LLVAR , 2, FT_ANS , 28,
103, Account ID 2 , 帐户标识2 , LLVAR , 2, FT_ANS , 28,
104, Transaction Description , 交易说明 , LLLVAR , 3, FT_ANS , 100,
105, Credits, Chargeback Amount , 反向贷记金额 , , 0, FT_N , 16,
106, Debits, Chargeback Amount , 反向借记金额 , , 0, FT_N , 16,
107, Credits, Chargeback Number , 反向贷记笔数 , , 0, FT_N , 10,
108, Debits, Chargeback Number , 反向借记笔数 , , 0, FT_N , 10,
109, Credits, Fee Amounts , 手续费贷记金额 , LLVAR , 2, FT_ANS , 84,
110, Debits, Fee Amounts , 手续费借记金额 , LLVAR , 2, FT_ANS , 84,
111, Reserved for ISO Use , 保留给ISO使用 , LLLVAR , 3, FT_ANS , 999,
112, Reserved for ISO Use , 保留给ISO使用 , LLLVAR , 3, FT_ANS , 999,
113, Reserved for ISO Use , 保留给ISO使用 , LLLVAR , 3, FT_ANS , 999,
114, Reserved for ISO Use , 保留给ISO使用 , LLLVAR , 3, FT_ANS , 999,
115, Reserved for ISO Use , 保留给ISO使用 , LLLVAR , 3, FT_ANS , 999,
116, Reserved for National Use , 保留给国家使用 , LLLVAR , 3, FT_ANS , 999,
117, Reserved for National Use , 保留给国家使用 , LLLVAR , 3, FT_ANS , 999,
118, Reserved for National Use , 保留给国家使用 , LLLVAR , 3, FT_ANS , 999,
119, Reserved for National Use , 保留给国家使用 , LLLVAR , 3, FT_ANS , 999,
120, Reserved for National Use , 保留给国家使用 , LLLVAR , 3, FT_ANS , 999,
121, Reserved for National Use , 保留给国家使用 , LLLVAR , 3, FT_ANS , 999,
122, Reserved for National Use , 保留给国家使用 , LLLVAR , 3, FT_ANS , 999,
123, Reserved for Private Use , 保留给民间使用 , LLLVAR , 3, FT_ANS , 999,
124, Reserved for Private Use , 保留给民间使用 , LLLVAR , 3, FT_ANS , 999,
125, Reserved for Private Use , 保留给民间使用 , LLLVAR , 3, FT_ANS , 999,
126, Reserved for Private Use , 保留给民间使用 , LLLVAR , 3, FT_ANS , 999,
127, Reserved for Private Use , 保留给民间使用 , LLLVAR , 3, FT_ANS , 999,
128, Message Authentication Code Field , 报文鉴别代码字段 , , 0, FT_B , 8,
};复制代码
bankman 发表于 2012-12-28 23:51
这个论坛发CODE 还是太难看了。对齐就那么难吗?
谢谢您细致的回复,建议重开一帖,以附件的形式发帖,这样就不会有对齐的麻烦了 |