银联8583

银联8583

一个字节可以用两个十六进制数字来表示

image-20250214152928230

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"

示例 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"
      • 嵌套 TLV 2:
        • Tag: 0x9F28
        • Length: 0x03
        • Value: 0x41 0x42 0x43(ASCII 解码为 "ABC"

TLV 解析步骤

  1. 读取 Tag
    • 读取第一个字节(或更多字节,根据协议定义)作为 Tag。
    • 例如:0x9F26
  2. 读取 Length
    • 读取接下来的字节作为 Length。
    • 如果 Length 是变长的(如 BER 编码),需要根据规则解析。
    • 例如:0x05 表示 Value 有5个字节。
  3. 读取 Value
    • 根据 Length 读取对应字节数的数据。
    • 例如:0x31 0x32 0x33 0x34 0x35
  4. 递归解析(如果有嵌套 TLV):
    • 如果 Value 本身是 TLV 结构,递归解析。

TLV 的优点

  1. 灵活性
    • 支持任意类型的数据。
    • 可以嵌套,适合复杂数据结构。
  2. 可扩展性
    • 新增字段只需定义新的 Tag,不影响现有解析逻辑。
  3. 自描述性
    • 每个字段都有明确的 Tag 和 Length,易于解析和调试。

TLV 的应用场景

  1. 金融支付
    • 银联8583协议、EMV卡数据等。
    • 例如:交易金额、商户号、终端号等字段。
  2. 通信协议
    • 用于定义消息格式,如 SNMP、LDAP 等。
  3. 数据存储
    • 用于存储结构化数据,如配置文件、数据库记录等。

银联8583协议中的 TLV

在银联8583协议中,TLV 通常用于变长字段(如55域、104域等)。每个域的定义由银联规范决定,解析时需要参考具体的 Tag 定义表。

例如:

  • Tag: 0x9F26 可能表示应用密文。
  • Length: 表示密文的长度。
  • Value: 存储实际的密文数据。

总结

TLV 是一种高效、灵活的数据编码方式,适用于需要自描述性和可扩展性的场景。理解 TLV 的关键在于掌握 TagLengthValue 的结构,以及如何递归解析嵌套的 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

×

喜欢就点赞,疼爱就打赏

相册 说点什么 简历