这页所有内容都从三个事实推出来:
把这张对照表放在手边,整个手算过程只需要查它:
| 十六进制 | 二进制 | 十六进制 | 二进制 |
|---|---|---|---|
0 | 0000 | 8 | 1000 |
1 | 0001 | 9 | 1001 |
2 | 0010 | A | 1010 |
3 | 0011 | B | 1011 |
4 | 0100 | C | 1100 |
5 | 0101 | D | 1101 |
6 | 0110 | E | 1110 |
7 | 0111 | F | 1111 |
拿一条真实位图从头走到尾:
7238400108C08000
步骤:
1 的,对应的域就存在。一个省数数的捷径:第 k 个字符覆盖第 4(k−1)+1 到 4k 位。第 1 个字符管 1–4 位,第 2 个管 5–8 位,第 11 个管 41–44 位。完整拆解如下:
| 字符序号 | 十六进制 | 二进制 | 覆盖位 | 置位的域 |
|---|---|---|---|---|
| 1 | 7 | 0111 | 1–4 | 2、3、4 (第 1 位 = 0 → 没有二级位图) |
| 2 | 2 | 0010 | 5–8 | 7 |
| 3 | 3 | 0011 | 9–12 | 11、12 |
| 4 | 8 | 1000 | 13–16 | 13 |
| 5 | 4 | 0100 | 17–20 | 18 |
| 6 | 0 | 0000 | 21–24 | — |
| 7 | 0 | 0000 | 25–28 | — |
| 8 | 1 | 0001 | 29–32 | 32 |
| 9 | 0 | 0000 | 33–36 | — |
| 10 | 8 | 1000 | 37–40 | 37 |
| 11 | C | 1100 | 41–44 | 41、42 |
| 12 | 0 | 0000 | 45–48 | — |
| 13 | 8 | 1000 | 49–52 | 49 |
| 14 | 0 | 0000 | 53–56 | — |
| 15 | 0 | 0000 | 57–60 | — |
| 16 | 0 | 0000 | 61–64 | — |
结果:域 2、3、4、7、11、12、13、18、32、37、41、42、49——典型授权报文的形状:卡号、处理码、金额、时间戳、STAN、时间日期、收单机构号、检索参考号、终端号、商户号、货币码。每个号码具体是什么,查域速查表;把同一串十六进制粘进位图计算器,它会把 64 位逐位画出来,跟你纸上的结果逐位对。
域号清单到手之后还有两件事要记住:数据域按域号从小到大排列,然后每个域各有各的长度规则(定长、LLVAR、LLLVAR)——那一层在读懂域格式记法里讲。
反方向更好算的诀窍是:别想 64 个位,想 8 个字节、每个字节管 8 个域:
| 字节 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| 管辖的域 | 1–8 | 9–16 | 17–24 | 25–32 | 33–40 | 41–48 | 49–56 | 57–64 |
对任意域 N:字节序号 = ⌈N/8⌉,字节内位置 = ((N−1) mod 8) + 1,从左数。每个位置有固定的十六进制权重——字节的值就是所有置位权重之和:
| 字节内位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| 权重(十六进制) | 80 | 40 | 20 | 10 | 08 | 04 | 02 | 01 |
动手算一个——给定域 2、3、4、11、41,拼出位图:
| 字节 | 管辖的域 | 本字节里出现的 | 位模式 | 十六进制 |
|---|---|---|---|---|
| 1 | 1–8 | 2、3、4 | 01110000 | 70 (40+20+10) |
| 2 | 9–16 | 11 → 位置 3 | 00100000 | 20 |
| 3 | 17–24 | — | 00000000 | 00 |
| 4 | 25–32 | — | 00000000 | 00 |
| 5 | 33–40 | — | 00000000 | 00 |
| 6 | 41–48 | 41 → 位置 1 | 10000000 | 80 |
| 7 | 49–56 | — | 00000000 | 00 |
| 8 | 57–64 | — | 00000000 | 00 |
把十六进制那列从上到下连起来读:
7020000000800000
验算两个不那么直观的域:域 11 → 字节 ⌈11/8⌉ = 2,位置 (11−1) mod 8 + 1 = 3,权重 20;域 41 → 字节 ⌈41/8⌉ = 6,位置 (41−1) mod 8 + 1 = 1,权重 80。在计算器的「域号 → 位图」输入框里敲 2,3,4,11,41,出来的正是这串十六进制。
第 1 位不是「DE1 存在」。第 1 位置位表示紧跟着第一张位图后面还有第二张 8 字节的位图(也叫扩展位图),覆盖域 65–128。DE1 本身就是二级位图——它永远不会作为数据域出现在解析结果里,所以任何一个正确的解码器都不会在输出里列出「域 1」。
二级位图的拆法和主位图完全一样,算完加 64:二级位图的位置 1 = 域 65,位置 6 = 域 70,位置 64 = 域 128。
下面是需要二级位图的最小真实报文——网络回声测试(0800),真实报文示例里逐字节拆过这一条:
8220000000000000 0400000000000000
| 部位 | 十六进制 | 二进制 | 含义 |
|---|---|---|---|
| 主位图第 1 字符 | 8 | 1000 | 第 1 位置位 → 后面跟着二级位图 |
| 主位图第 2 字符 | 2 | 0010 | 第 7 位 → DE7(传输日期时间) |
| 主位图第 3 字符 | 2 | 0010 | 第 11 位 → DE11(STAN) |
| 二级位图第 1 字节 | 04 | 00000100 | 位置 6 → 64 + 6 = DE70(网络管理码) |
存在的域:7、11、70。就因为 DE70 超过了 64,这条只有三个域的小报文也必须背上 16 字节的位图。在解析器里打开完整的 0800 →
眼前摆着 32 个十六进制字符,不等于有 32 个字符的位图——由第 1 位说了算。取示例文章里那条 0100 授权的开头:位图,加上紧随其后的 16 个字符的数据:
723C448028C08000 1640000012345678
第一个字符是 7 = 0111——第 1 位是 0,位图到第 16 个字符就结束了。后面那段(16 加 4000001234…)是 DE2:LLVAR 长度 16,接着是卡号的开头。要是硬把这 16 个字符按位图的算法过一遍,会「解出」域 68、70、71、74、100、103、107、108、110、114、116、118、119、122、123、124、125——凭空多出 17 个根本没发过的域,而 DE2 之后每一个真实的域都会落到错的位置上。
识别信号恰恰就是这个模式:一条平平无奇的报文里突然散落一堆编号很高、很少用到的域。把这 32 个字符整段粘进位图计算器,它会指出来:第 1 位是 0,后 16 个字符不是位图,已忽略。
组包方向的镜像错误。假设报文在域 2、3、4、11、41 之外还要带 DE90(原始数据元素,冲正用)。只在后面追加一张位置 26 置位的二级位图是不够的——第 1 位必须同时置上,而这会改掉整条位图的第一个字节:
| 位图 | 接收方会怎么读 | |
|---|---|---|
| 正确 | F020000000800000 0000004000000000 | 首字符 F = 1111:第 1 位为 1 → 读 16 字节,解出 2、3、4、11、41、90 |
| 忘了第 1 位 | 7020000000800000 0000004000000000 | 首字符 7:第 1 位为 0 → 只读 8 字节,然后把 0000004000… 当成 DE2 的开头去解——从这里起全部错位 |
注意第一个字节:70 变成了 F0,因为加上了第 1 位的权重(80)。接收方不会以「位图非法」拒掉错的那条——它会在数据深处才失败,抛出一个让人摸不着头脑的长度或格式错误。计算器两个方向都设了防:域号框里只要出现大于 64 的域,第 1 位自动置上;粘一条首字符 ≥ 8 却只有 16 个字符的位图进去,它会提示二级位图缺失、这个值不完整。
0–7 → 第 1 位为 0 → 恰好 16 个字符;8–F → 第 1 位为 1 → 必须有 32 个。首字符 ≥ 8 而手上只有 16 个字符,值一定被截断了。F 多半是起始偏移不对,或者把 ASCII/BCD 编码的字节按错误的编码读了——同样的字节在不同编码下会得到完全不同的位图。解析器会自动给各种编码打分,示例文章里有一份「报文解不开」的排查清单。"7238…")传输;二进制编码下它是 8 个原始字节,只是在十六进制查看器里看起来像 16 个字符。在纸上两种解法完全一样——差别在你数原始报文字节偏移的时候。ISO 8583 最多定义 128 个数据域,但一条典型报文只带其中 10–20 个。要是用定长布局,每条报文都得给全部 128 个域留位置——每笔交易浪费几百个字节,再乘以几十亿笔。位图花 8 个字节(用到 64 以上的域时 16 个)说清「后面只有这些域」,让每条报文只携带自己需要的东西;接收方解析任何数据之前,查一个位就知道「DE55 在不在」。位图在 MTI 和数据域之间处于什么位置,见怎么读一条 ISO 8583 报文。
👉 不想自己画位,想让工具把 64 位画给你看?位图计算器两个方向都能算——十六进制出域号、域号出十六进制;想看位图在完整报文里怎么干活,把真实示例里的报文粘进解析器。