C40 编码是一种用于二维条码(如Data Matrix)的高效数据压缩编码模式,特别适合编码大写字母、数字和特定符号。以下是C40编码的详细介绍:
基本概念
C40编码属于"多字节压缩"编码模式,它将3个ASCII字符压缩为2个字节(16位),从而实现数据压缩。
编码字符集
C40编码支持以下字符:
大写字母(A-Z)
数字(0-9)
空格
特定符号:! " % & ' ( ) * + , - . / : ; < = > ?
编码原理
字符映射:首先将每个字符映射到一个值(0-39)
0-9: 数字0-9 → 值0-9
A-Z: 字母A-Z → 值10-35
空格 → 值36
符号 → 值37-39(具体分配见符号表)
三字符组处理:将三个输入字符组合为一个16位值
计算公式:1600 × C1 + 40 × C2 + C3 + 1
其中C1,C2,C3是三个字符的映射值
两字节存储:将计算出的16位值存储为两个字节(高位字节在前)
编码过程示例
例如编码字符串"ABC":
映射:A→10, B→11, C→12
计算:1600×10 + 40×11 + 12 + 1 = 16000 + 440 + 13 = 16453
转换为十六进制:0x4045
存储为两个字节:0x40 0x45
特殊处理
奇数个字符:如果字符数不是3的倍数,最后一个字符单独处理
使用特殊的移位编码(Shift 1, Shift 2或Shift 3)
混合模式:当遇到C40不支持的字符时,需要切换到ASCII模式
Unlatch:编码结束时需要添加解锁码(通常为0xFE)表示返回默认模式
C40 编码示例:编码 "DATA123"
步骤 1:字符映射
C40 编码将每个字符映射到 0~39 的值:
| 字符 | 映射值 |
|---|---|
| D | 13 |
| A | 10 |
| T | 29 |
| A | 10 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
步骤 2:分组(3 个字符一组)
第一组:
D (13)A (10)T (29)第二组:
A (10)1 (1)2 (2)剩余字符:
3 (3)(单独处理)
步骤 3:计算每组的值
C40 计算公式:
值 = 1600 × C1 + 40 × C2 + C3 + 1
第一组(D A T):
1600 × 13 + 40 × 10 + 29 + 1 = 20800 + 400 + 30 = 21230
转换为 16 进制:21230 = 0x52EE
存储为 2 字节:0x52 0xEE
第二组(A 1 2):
1600 × 10 + 40 × 1 + 2 + 1 = 16000 + 40 + 3 = 16043
转换为 16 进制:16043 = 0x3EAB
存储为 2 字节:0x3E 0xAB
步骤 4:处理剩余字符
剩余 3 (3),由于 C40 要求 3 个字符一组,这里需要 填充:
使用 Shift 1(表示后面仅 1 个有效字符):
Shift 1的 C40 映射值是0(特殊编码)1600 × 0 + 40 × 3 + 0 + 1 = 0 + 120 + 1 = 121
16 进制:
121 = 0x79
存储为 2 字节:0x000x79(Shift 1 占用第一个字节)
步骤 5:添加解锁码(Unlatch)
C40 编码结束后,需要添加 解锁码 0xFE,表示切换回默认模式。
最终编码结果
| 数据组 | 字节表示 |
|---|---|
| D A T | 0x52 0xEE |
| A 1 2 | 0x3E 0xAB |
| Shift 1 + 3 | 0x00 0x79 |
| Unlatch | 0xFE |
完整编码(十六进制):
52 EE 3E AB 00 79 FE
解码验证
解码时:
读取
0x52EE→21230→(21230-1)/1600=13 (D),余400→(400)/40=10 (A),余0→29 (T)读取
0x3EAB→16043→(16043-1)/1600=10 (A),余42→(42)/40=1 (1),余2 (2)读取
0x0079→121→Shift 1,然后(121-1)/40=3 (3)遇到
0xFE停止 C40 模式
最终解码结果:DATA123 ✅
优势与应用
高密度:对适合的字符集可实现约1.5:1的压缩比
广泛应用:常用于Data Matrix、Aztec Code等二维条码中
效率高:特别适合编码包含大量字母数字的数据
C40编码通过这种巧妙的压缩方式,显著提高了条码的数据存储效率,特别是在处理以字母数字为主的数据时表现优异。
总结
C40 编码 3 个字符 → 2 字节,压缩效率高。
如果字符数不是 3 的倍数,使用 Shift 1/2/3 处理剩余字符。
编码结束必须加
0xFE(Unlatch) 退出 C40 模式。