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 字节:0x00
0x79
(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 模式。