一维条形码Code128的编码与生成

时间:2024-04-17 18:59:49

近期疫情形势还是比较严峻的,在此向奋战在一线的医务工作者致敬!武汉加油,全国加油!

最近笔者接了一个项目需要生成条形码并给出配套的解码程序,研究了几个小时以后有了一定成果,记录一下@[email protected]

Code128条码编码规则

CODE128条码应该来说是应用比较广泛的一类条码编码,由于其可以表示0~127的数据故称为Code128。事实上Code128分为3类:128A、128B、128C,其特性如下

类型 特性
Code128A 大写字符、数字、标点、控制符
Code128B 大小写字符、数字、标点
Code128C 纯数字

笔者在项目中选择了Code128A类型的编码。事实上无论是128A还是128B、128C,其编码规则都是一致的,有如下几部分

前空白 起始位 数据 校验位 结束位 后空白

以下给以详细介绍

前后空白

前后空白的规定比较松,只需最小宽度为10倍单位宽度即可,(注:单位宽度就是宽度为1的条纹宽度),当然空白越大越容易识别,对于某些识别程序而言判别机制做得较差,即使留出10倍宽度也经常无法识别,因此在工业现场或其他应用场合须做一定量的测试

起始位

起始位是条码能见部分的开始,也是区分3种编码的主要方式。

码制 起始位[黑 白 黑 白 黑 白]
Code128A 2,1,1,4,1,2
Code128B 2,1,1,2,1,4
Code128C 2,1,1,2,3,2

例如
Alt
该条码起始位为2黑、1白、1黑、4白、1黑、2白,也就是说这是一个Code128A条码。

数据

数据区较为有意思,因为其与ASCII字符集中的可见字符是一一映射的,因此似曾相识。以下给出部分

数据 [黑 白 黑 白 黑 白] Code128A Code128B Code128C
2,1,2,2,2,2 空格 00
2,2,2,1,2,2 ! 01
2,2,2,2,2,1 " 02
1,2,1,2,2,3 # 03
1,2,1,3,2,2 $ 04
1,3,1,2,2,2 % 05

我们需要注意的是,Code128A的字符集以“空格”打头,这是ASCII字符集的第一个可见字符,但是在Code128B中,该字符不是有效字符,在Code128C中代表了两位数00

因此从ASCII字符到Code128字符需要减去32

校验位

校验位采用校验和模103的方式,如下表示

C=(iN)mod103C=(\sum i\cdot N) mod\, 103
其中NN为该位数据的值,由前面介绍可知,N位其ASCII码值-32。
特别地数据头值如下

START A 103
START B 104
START C 105

例如计算Code128A型,数据位“0123”的校验码
C=[103+1×(032)+2×(132)+3×(232)+4×(332)]mod103=[103+1×(4832)+2×(4932)+3×(5032)+4×(5132)]mod103=[103+1×16+2×17+3×18+4×19]mod103=77C = [103 + 1 \times(\'0\'-32)+2\times (\'1\'-32)+3\times (\'2\'-32)+4 \times(\'3\'-32)]mod\,103\\=[103 + 1 \times(48-32)+2\times (49-32)+3\times (50-32)+4 \times(51-32)]mod\,103\\ =[103 + 1 \times 16+2\times 17+3\times18+4 \times19]mod\,103 = 77
因此校验位为77

结束位

结束位是固定的

结束位 2, 3, 3, 1, 1, 1,2

这是一串7位数,这能够让最后一条为黑色

条码高度

为了保证识别效果,条码高度有一定要求,高度一般在条码总长的15%或者至少6.35mm,这个要求也比较宽松,当然随着识别距离的增加适当增加高度是有必要的。

实验结果

根据上述规则编写了一个测试代码,代码运行在STM32H750平台,使用FATFS将指定条码生成并保存为一个PDF文件,文件可以在PC上的打开查阅,结果如下。

在这里插入图片描述
生成的PDF使用Chrome顺利打开,条码使用手机QQ扫码识别成功。