C40 编码是一种用于二维条码(如Data Matrix)的高效数据压缩编码模式,特别适合编码大写字母、数字和特定符号。以下是C40编码的详细介绍:

基本概念

C40编码属于"多字节压缩"编码模式,它将3个ASCII字符压缩为2个字节(16位),从而实现数据压缩。

编码字符集

C40编码支持以下字符:

  • 大写字母(A-Z)

  • 数字(0-9)

  • 空格

  • 特定符号:! " % & ' ( ) * + , - . / : ; < = > ?

编码原理

  1. 字符映射:首先将每个字符映射到一个值(0-39)

    • 0-9: 数字0-9 → 值0-9

    • A-Z: 字母A-Z → 值10-35

    • 空格 → 值36

    • 符号 → 值37-39(具体分配见符号表)

  2. 三字符组处理:将三个输入字符组合为一个16位值

    • 计算公式:1600 × C1 + 40 × C2 + C3 + 1

    • 其中C1,C2,C3是三个字符的映射值

  3. 两字节存储:将计算出的16位值存储为两个字节(高位字节在前)

编码过程示例

例如编码字符串"ABC":

  1. 映射:A→10, B→11, C→12

  2. 计算:1600×10 + 40×11 + 12 + 1 = 16000 + 440 + 13 = 16453

  3. 转换为十六进制:0x4045

  4. 存储为两个字节:0x40 0x45

特殊处理

  1. 奇数个字符:如果字符数不是3的倍数,最后一个字符单独处理

    • 使用特殊的移位编码(Shift 1, Shift 2或Shift 3)

  2. 混合模式:当遇到C40不支持的字符时,需要切换到ASCII模式

  3. Unlatch:编码结束时需要添加解锁码(通常为0xFE)表示返回默认模式

C40 编码示例:编码 "DATA123"

步骤 1:字符映射

C40 编码将每个字符映射到 0~39 的值:

字符映射值
D13
A10
T29
A10
11
22
33

步骤 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 个字符一组,这里需要 填充

  1. 使用 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 T0x52 0xEE
A 1 20x3E 0xAB
Shift 1 + 30x00 0x79
Unlatch0xFE

完整编码(十六进制):

52 EE 3E AB 00 79 FE

解码验证

解码时:

  1. 读取 0x52EE21230(21230-1)/1600=13 (D),余 400(400)/40=10 (A),余 029 (T)

  2. 读取 0x3EAB16043(16043-1)/1600=10 (A),余 42(42)/40=1 (1),余 2 (2)

  3. 读取 0x0079121Shift 1,然后 (121-1)/40=3 (3)

  4. 遇到 0xFE 停止 C40 模式

最终解码结果:DATA123


优势与应用

  • 高密度:对适合的字符集可实现约1.5:1的压缩比

  • 广泛应用:常用于Data Matrix、Aztec Code等二维条码中

  • 效率高:特别适合编码包含大量字母数字的数据

C40编码通过这种巧妙的压缩方式,显著提高了条码的数据存储效率,特别是在处理以字母数字为主的数据时表现优异。

总结

  • C40 编码 3 个字符 → 2 字节,压缩效率高。

  • 如果字符数不是 3 的倍数,使用 Shift 1/2/3 处理剩余字符。

  • 编码结束必须加 0xFE(Unlatch) 退出 C40 模式。