选 MTI、勾上要带的域、填值。位图、副位图和每个变长域的长度前缀都自动算,不用手数字符。
一条完整的 ISO 8583 报文:4 位 MTI、主位图(勾到 64 以上的域时自动追加副位图),然后按域号从小到大排列每个勾选的域,变长域自带长度前缀。
报文显示出来之前,会先送回解析器页面所用的同一份解析代码解一遍。只要有一个字节对不上,页面给出的就是红色的失败提示,而不是报文。
字典里每个域记四件事:名称、定长(FIX)还是变长(LLVAR / LLLVAR)、最大长度、数据类型(n 数字、an 字母数字、ans 字母数字加特殊字符、b 二进制、z 磁道数据)。这四件事决定值怎么写到报文里,剩下的由你选的编码决定。
| 编码 | MTI | 长度前缀 | 数字域与二进制域 | 文本域 |
|---|---|---|---|---|
| ASCII | 4 个字符 | 2 或 3 个十进制字符 | 1 位数字占 1 个字符 | 1 个字符占 1 个字符 |
| Hex / BCD | 4 个十六进制字符 | 2 或 3 位十进制数字,写成十六进制字符 | 压缩存放:1 字节放 2 位数字,长度按十六进制字符计 | 1 个字符占 2 个十六进制字符 |
| EBCDIC | 4 个 EBCDIC 字节 | 2 或 3 位 EBCDIC 数字 | 二进制域仍写十六进制 | 1 个字符占 1 个 EBCDIC 字节 |
三种编码下位图都写成十六进制字符,这正是本站解析器读位图的方式。有些真实接口把位图按 8 个裸字节发送 —— 同样是 64 位,字符数少一半。
Hex / BCD 模式下数字域按 1 字节 2 位数字压缩存放,所以长度数的是数字位数不是字节数:19 位卡号的 LLVAR 前缀就是 19,占 19 个十六进制字符 —— 九个半字节。位数为奇数的域会让后面的数据错开半个字节,构造器会在报文下方提示。真实卡组规范会把这类域补齐到整字节,且各自规定补在哪一侧;补哪边属于接口约定,所以这里不替你补。
64 位主位图的每一位代表一个域在不在:第 2 位是 DE2,第 3 位是 DE3,以此类推。勾上 64 以上的域,第 1 位就会置 1,表示后面还跟着第二个 64 位位图,管 65–128 号域。这也是手写报文最常错的地方 —— 带 DE90 的 0400 冲正必须有副位图,所以它的第一个十六进制字符是 F 不是 7。反过来拆位图用位图计算器。
ans 数据。六个起手样例逐域取自站上的ISO 8583 报文样例那篇文章。载入一条,改掉金额或流水号,你手里就是一条「和已知能解的报文只差你改的那一处」的测试报文。