银联8583
一个字节可以用两个十六进制数字来表示
8583交易报文格式
(报文总长度)+报文头+报文类型标识+位图+报文域
报文头与报文类型标识符、位图和报文域一块组成了一个完整的报文。标准报文头的长度固定,由9个域组成。
一个8583消费请求报文:
303538312E82303538313030303130303030202020313434323739303020202000000000303030303030303000303030303030323030F23C46C1A8E09A100000000001000001313936323132313432363030303030303030313637303030303030303030303030303030313233303230353130323234313337363839393130323234313032303532393033373031313037313030303030313230383134343237393633303831343432373930303336363231323134323630303030303030303136373D323930333232303439333930333131323134343038323030303037383330313232393135343432373936333730313130303035B0AED2E2BECDCFF1B4F3D3EAC2E4CFC2D4F5BBE1C8C3C8CBB2BBC7A3B9D2202020202020202020203135366650CB51C0EA55AF323430303030303030303030303030303134359F2701809F101307010103A00000040A0100000489729AD841409F3704F896B45E9F36020637950500000000009A032502059C01009F02060000000001235F2A02015682027C009F1A0201569F03060000000000009F3303E0E9C89F3501229F1E0830303030303030318408A0000003330101019F090200209F4104000000019F260804FE275AFCB02BA79F340300000030323330303030393630303033303030303030303030303031313038375049303832010A3130392E303139363239020733342E323134360305533330313604023034051430303030303330344E374E4C3030373539343835060630303031363707083142324631324435080833313130303420203030303030303030
报文头
每域都是定长
(报文总长度):不一定有,标准没有。长度4字节
报文头:
域1 头长度:1字节 8bit二进制数,除了明确标识报文头的长度,例如46以外
域2 头标识和版本号:1字节 8bit二进制数
域3 整个报文长度:4字节
域4 目的ID:11字节 必须
域5 源ID:11字节 必须
域6 报文状态标识:3字节 必须
域7 批次号:1字节 必须
域8 保留使用:8字节 必须
域9 用户信息:1字节 必须
例如消息头hex编码内容:2E823035383130303031303030302020203134343237393030202020000000003030303030303030003030303030
域1: 2E(十六进制编码值) ==> 46(十进制编码值)
域2: 82(十进制编码值) ==> 10000010(二进制编码值)
域3: 30333131(十六进制编码值) ==> 0311(acsii字符)
域4: 3030303130303030202020(十六进制编码值) ==> `00010000 `(acsii字符 带空格)
等等
报文类型标识
4位定长
类型标识:
例如类型标识hex编码内容:
30323030(十六进制编码值) ==> 0200(acsii字符)
位图
一个位图 8字节
主位图的第一位用来指明在主位图后是否还有第二个位图,
位图第一位是0,表示主位图后没有第二个位图。
位图第一位是1,表示主位图后有第二个位图。
除了第一位,每一位和一个域相对应,即和域2到域64相对应。
若位图一中出现了55域,说明这是一个IC卡交易。每位的值指示 该域是否出现在报文中
如果一个位为0,与之对应的域不出现在报文中;
如果一个位为1,与之对应的域出现在报文中。
位图1
例如类型标识hex编码内容:
F23C46C1A8E09A10(十六进制编码值)
==> 1111001000111100010001101100000110101000111000001001101000010000(二进制编码值)
第一位1:有第二位图
第二位1:有第2域
第三位1:有第3域
第四个1:有第4域
第五个0:没有第5域
依次类推。
位图2
例如类型标识hex编码内容:
0000000001000001(十六进制编码值)
==> 0000000000000000000000000000000000000001000000000000000000000001(二进制编码值)
最后一个1:有128域
报文域
采用的编码方式为ASCII码
报文域数据类型、长度属性及格式含义表
字符 | 含义 |
---|---|
a | 字母字符,A至Z,a至z,向左靠,右边多余位填空格 |
b | 数据的二进制表示,后跟数字表示位(bit)的个数 |
B | 用于表示变长的二进制数,后跟数字表示二进制数据所占字节(Byte)的个数 |
n | 数值,0至9,右靠,首位有效数字前填零。若表示人民币金额,则最右二位为角、分 |
p | 填充字符,如空格 |
s | 特殊符号 |
an | 字母和数字字符,左靠,右边多余位填空格 |
as | 字母和特殊字符,左靠,右边多余位填空格 |
cn | 压缩数字码,即BCD码 |
ns | 数字和特殊字符,左靠,右边多余位填空格 |
ans | 字母、数字和特殊字符,左靠,右边多余位填空格 |
ansb | 字母、数字、特殊字符和二进制数,左靠,右边多余位填空格 |
MM | 月份,01至12 |
DD | 日期,01至31 |
YY | 年份,00至99 |
hh | 时,00至23 |
mm | 分,00至59 |
ss | 秒,00至59 |
LL | 后面跟随数据元的可变长度值,01至99 |
LLL | 后面跟随数据元的可变长度值,001至999 |
VAR | 可变长度数据元 |
3 | 3字符的固定长度 |
..17 | 最大17个字符的可变长度。所有可变长度字段在数据元的前面应另外包含2个或3个位置,以表示后面到数据元结束时的位置数。 |
X | 借贷符号,贷记为“C”,借记为“D”,并且总是与一个数字型金额数据元相连,例如,交易费金额中X+N8含义为前缀“C”或“D”和交易费金额的8位数字。 |
Z | ISO 4909和ISO 7813中定义的磁卡第二、三磁道的代码集,但不包含起始符、结束符和LRC符 |
对任何最大长度小于100个字符的可变长度数据元,两个附加位位于该数据元之前,标明其后所跟 数据元的长度。其格式表示为LLVAR。
对任何最大长度小于1000个字符的可变长度数据元,三个附加位位于该数据元之前,标明其后所跟 数据元的长度。其格式表示为LLLVAR。
每域说明
域2(主账号):2个字节的长度值+最大19个字节(数字字符)的主账号 LLVAR
域3(交易处理码):6位定长
域4交易金额:n12,12位定长数字字符,当交易币种为人民币时,本域的最右两位应包含人民币的角和分。
域7(交易传输时间):n10,10位定长数字字符;格式:MMDDhhmmss
案例
报文域
例如消息体内容hex编码内容:
313936323132313432363030303030303030313637303030303030303030303030303030313233303230353130323234313337363839393130323234313032303532393033373031313037313030303030313230383134343237393633303831343432373930303336363231323134323630303030303030303136373D323930333232303439333930333131323134343038323030303037383330313232393135343432373936333730313130303035B0AED2E2BECDCFF1B4F3D3EAC2E4CFC2D4F5BBE1C8C3C8CBB2BBC7A3B9D2202020202020202020203135366650CB51C0EA55AF323430303030303030303030303030303134359F2701809F101307010103A00000040A0100000489729AD841409F3704F896B45E9F36020637950500000000009A032502059C01009F02060000000001235F2A02015682027C009F1A0201569F03060000000000009F3303E0E9C89F3501229F1E0830303030303030318408A0000003330101019F090200209F4104000000019F260804FE275AFCB02BA79F340300000030323330303030393630303033303030303030303030303031313038375049303832010A3130392E303139363239020733342E323134360305533330313604023034051430303030303330344E374E4C3030373539343835060630303031363707083142324631324435080833313130303420203030303030303030
根据位图得知 域2存在 两位变长 LLVAR
3139(十六进制值) ==> 19(acsii值) (表示域2的值长度位19字节)
36323132313432363030303030303030313637(十六进制值) ==> 6212142600000000167
根据位图得知 域3存在 定长6字节
303030303030 ==> 000000
根据位图得知 域4存在 定长12字节
303030303030303030313233 ==> 000000000123
根据位图得知 域7存在 定长10字节
30323035313032323431 ==> 0205102241 (MMDDhhmmss)
以此类推
TLV
TLV(Tag-Length-Value)是一种常见的数据编码格式,广泛应用于通信协议和数据交换中(如银联8583协议、EMV卡数据等)。它的核心思想是通过Tag标识数据类型,Length表示数据长度,Value存储实际数据。
TLV 结构详解
- Tag(标签):
- 用于标识数据的类型或含义。
- 可以是1个或多个字节。
- 通常用16进制表示。
- 例如:
0x9F26
表示一个特定的数据字段。
- Length(长度):
- 表示 Value 字段的字节长度。
- 可以是1个或多个字节。
- 例如:
0x05
表示 Value 有5个字节。
- Value(值):
- 存储实际的数据内容。
- 长度由 Length 字段决定。
- 例如:
0x31 0x32 0x33 0x34 0x35
表示字符串"12345"
。 0x31 是十六进制解码就是1
TLV 示例
示例 1:简单 TLV
- 数据:
0x9F26 0x05 0x31 0x32 0x33 0x34 0x35
- Tag:
0x9F26
- Length:
0x05
(表示 Value 有5个字节) - Value:
0x31 0x32 0x33 0x34 0x35
(ASCII 解码为"12345"
)
- Tag:
示例 2:嵌套 TLV
TLV 可以嵌套,即 Value 本身也是一个 TLV 结构。
- 数据:
0x9F26 0x0A 0x9F27 0x05 0x31 0x32 0x33 0x34 0x35 0x9F28 0x03 0x41 0x42 0x43
- Tag:
0x9F26
- Length:
0x0A
(表示 Value 有10个字节) - Value:
- 嵌套 TLV 1:
- Tag:
0x9F27
- Length:
0x05
- Value:
0x31 0x32 0x33 0x34 0x35
(ASCII 解码为"12345"
)
- Tag:
- 嵌套 TLV 2:
- Tag:
0x9F28
- Length:
0x03
- Value:
0x41 0x42 0x43
(ASCII 解码为"ABC"
)
- Tag:
- 嵌套 TLV 1:
- Tag:
TLV 解析步骤
- 读取 Tag:
- 读取第一个字节(或更多字节,根据协议定义)作为 Tag。
- 例如:
0x9F26
。
- 读取 Length:
- 读取接下来的字节作为 Length。
- 如果 Length 是变长的(如 BER 编码),需要根据规则解析。
- 例如:
0x05
表示 Value 有5个字节。
- 读取 Value:
- 根据 Length 读取对应字节数的数据。
- 例如:
0x31 0x32 0x33 0x34 0x35
。
- 递归解析(如果有嵌套 TLV):
- 如果 Value 本身是 TLV 结构,递归解析。
TLV 的优点
- 灵活性:
- 支持任意类型的数据。
- 可以嵌套,适合复杂数据结构。
- 可扩展性:
- 新增字段只需定义新的 Tag,不影响现有解析逻辑。
- 自描述性:
- 每个字段都有明确的 Tag 和 Length,易于解析和调试。
TLV 的应用场景
- 金融支付:
- 银联8583协议、EMV卡数据等。
- 例如:交易金额、商户号、终端号等字段。
- 通信协议:
- 用于定义消息格式,如 SNMP、LDAP 等。
- 数据存储:
- 用于存储结构化数据,如配置文件、数据库记录等。
银联8583协议中的 TLV
在银联8583协议中,TLV 通常用于变长字段(如55域、104域等)。每个域的定义由银联规范决定,解析时需要参考具体的 Tag 定义表。
例如:
- Tag:
0x9F26
可能表示应用密文。 - Length: 表示密文的长度。
- Value: 存储实际的密文数据。
总结
TLV 是一种高效、灵活的数据编码方式,适用于需要自描述性和可扩展性的场景。理解 TLV 的关键在于掌握 Tag、Length 和 Value 的结构,以及如何递归解析嵌套的 TLV 数据。
域55 TVL编码
ansb…255(LLLVAR),3个字节的长度值+最大255个字节的数据
域55
例如55域内容hex编码内容:
9F2701809F101307010103A00000040A0100000489729AD841409F3704F896B45E9F36020637950500000000009A032502059C01009F02060000000001235F2A02015682027C009F1A0201569F03060000000000009F3303E0E9C89F3501229F1E0830303030303030318408A0000003330101019F090200209F4104000000019F260804FE275AFCB02BA79F3403000000
9F27
域104 TVL编码
ansb…512(LLLVAR),3字节长度值+最大512个字节
<域总长度><用法ID1><用法ID1长度><用法ID1取值>……<用法IDn><用法IDn长度><用法IDn取值>
域总长度:3个字节
用法ID:2个字节
域104 pi用法
例如104域内容hex编码内容:
5049303832051430303030303330344E374E4C30303735393438350402303406063030303136370708314232463132443508083331313030342020010A3130392E303139363239020733342E3231343603055333303136
用法id1:5049 ==> PI
用法ID1长度:303832 ==> 082
用法ID1取值
tlv05 (05 14 30303030303330344E374E4C3030373539343835)
t:05
l:14(十六进制值) ==> 20(十进制值)
v:30303030303330344E374E4C3030373539343835 ==> 00000304N7NL00759485
tlv04 (04 02 3034)
t:04
l:02(十六进制值) ==> 02(十进制值)
v:3034 ==> 04
tlv06 (06 06 303030313637)
t:06
l:06(十六进制值) ==> 06(十进制值)
v:303030313637 ==> 000167
tlv07 (07 08 3142324631324435)
t:07
l:08(十六进制值) ==> 08(十进制值)
v:3142324631324435 ==> 1B2F12D5
tlv08 (08 08 3331313030342020)
t:08
l:08(十六进制值) ==> 08(十进制值)
v:3142324631324435 ==> [311004 ] 有两个空格
tlv01 (01 0A 3130392E303139363239)
t:01
l:0A(十六进制值) ==> 10(十进制值)
v:3130392E303139363239 ==> 109.019629
tlv02 (02 07 33342E32313436)
t:02
l:07(十六进制值) ==> 07(十进制值)
v:33342E32313436 ==> 34.2146
tlv03 (03 05 5333303136)
t:03
l:05(十六进制值) ==> 05(十进制值)
v:5333303136 ==> S3016
日夜颠倒头发少 ,单纯好骗恋爱脑 ,会背九九乘法表 ,下雨只会往家跑 ,搭讪只会说你好 ---- 2050781802@qq.com