2021SC@SDUSC Zxing开源代码(八)Data Matrix二维码(一)

2021SC@SDUSC


前言:本篇博客简单介绍了Data Matrix相关知识,以及编码步骤过程。


一、Datamatrix简介

1.1 概述

Data Matrix二维码由美国国际资料公司(International Data Matrix)于1989年发明,是一种由黑色、白色的色块以正方形或长方形组成的二维码,其发展构想是希望在较小的标签上存储更多的信息量。DM码的最小尺寸是目前所有条码中最小的,特别适合于小零件的的标识,直接印刷在实体上,被广泛应用在电路、药品等小件物品以及制造业的流水线生产过程。
旧版的 Data Matrix 码包括 ECC000、ECC050、ECC080、ECC100 和 ECC140,而ECC200 是最新的 Data Matrix码版本,两者最大差别在于模块数目。旧版本的模块为奇数,而新版本的模块为偶数。相比而言,ECC200容错能力较强,更为常见,以下所说的Data Matrix二维码特指ECC200。
在这里插入图片描述

1.2 Data Matrix 码结构

Data Matrix码由数据区、寻边区(finder pattern)和空白区(quiet zone)组成。数据区包含着编码信息,包括数字、字母和汉字等按照一定的编码规则生成。每个相同大小的黑色和白色方格称为一个数据单元,分别代表二进制的1和0。寻边区包括L型的实心定位标识和反L型的虚线时钟标识。L型实心定位标识主要用于限定Data Matrix码的物理尺寸、定位和符号失真。反L型虚线边界主要用于限定单元结构,但也能帮助确定物理尺寸及失真。条码读取器通过对定位标识与时钟标识进行图像处理来检测位置,可进行 360° 全方位读取。寻边区外层为空白区,宽度至少为1个数据单元。
在这里插入图片描述
Data Matrix码总共有24种尺寸规格,最小尺寸为10×10模块,最大尺寸为144×144模块。当模块数目超过26×26时将进行分区块,每个区块不会超过26个模块。此结构可防止失真。

符号尺寸区块数据单元
10×10 至 26×2618×8 至 24×24
28×28 至 52×52414×14 至 24×24
64×64 至 104×1041614×14 至 24×24
120×120 至 144×1443618×18 至 22×22

Data Matrix 码的实际尺寸的计算方法为符号尺寸乘以模块的可印刷尺寸。
例如单元尺寸为 0.25 mm,
符号尺寸:10 × 10 模块 = 2.5 × 2.5 mm
符号尺寸:32 × 32 模块 = 8.0 × 8.0 mm
符号尺寸:8 × 18 模块 = 2.0 × 4.5 mm

二、Data Matrix编码规则

Data Matrix码数据区由相同大小的黑白格子组成,分别代表二进制的1和0,以二维元码(binary code)方式进行编码,计算机可直接读取其数据信息。最常见的编码模式采用ASCII方式,每个编码单元有8位,代表一个字节。8个方格组成L型方格阵。
在这里插入图片描述
如下图Data Matrix码编码的信息为“Wikipedia”,从数据区左上角第5行第1列开始编码,位于中间区域的编码单元都为标准L型,但位于边缘区域的编码单元被分为多个部分,比如首字母W,部分在左边缘,剩余的部分位于对应右边缘。两部分合起来组成标准L型编码单元。
在这里插入图片描述
另外,在角落中的编码单元可能组成不同的形状(非L型)
在这里插入图片描述
除了上述ASCII编码方式,Data Matrix编码还提供了Text、C40、X12、EDIFACT和Base256模式。

编码模式字符集每字符数据位数
ASCII数字成对编码4
ASCIIASCII 0-1278
ASCII扩展ASCII 128-25516
C40主要为大写字母和数字5.33
Text主要为小写字母和数字5.33
X12ANSI X12 EDI 数据集5.33
EDIFACTASCII 32-946
Base 2560-255 范围的任何数据8

不同编码模式可以通过编码值大小进行切换,默认编码模式为ASCII(非扩展),编码值在1~128内,当编码值大于128时,将切换到其他编码模式,比如编码值为230代表后续编码切换到C40编码模式。

CodewordInterpretationCodewordInterpretation
0Not used1-128130-229
129End of messageDigit pairs 00 – 99
230Begin C40 encoding231Begin Base 256 encoding
232FNC1(GS1标准规格)233Structured append. Allows a message to be split across multiple symbols.
234Reader programming235Upper Shift - Set high bit of the following character
23605 Macro23706 Macro
238Begin ANSI X12 encoding239Begin Text encoding
240Begin EDIFACT encoding241Extended Channel Interpretation code
242-255Not used

C40、Text和X12编码模式存储文字信息更为节约,将字符编码范围约束在0~39,三个字符组合有403=64000种,通过两个字节便可完成编码(2562= 65536)
V = C 1 × 1600 + C 2 × 40 + C 3 + 1 V = C1×1600 + C2×40 + C3 + 1V=C1×1600+C2×40+C3+1
B 1 = f l o o r ( V / 256 ) B1 = floor(V/256)B1=floor(V/256)
B 2 = V m o d 256 B2 = V mod 256B2=Vmod256
其中,C1,C2和C3为编码前的字符,B1和B2编码后的字节表示。单个字符编码占据2*8/3=5.33位,B1字节的结果值范围为0~249。当该值设置为254时,编码模式换回ASCII方式。

三、Data Matrix纠错能力

Data Matrix码在一部分损坏时也能够自动纠错而不会丢失数据。如下图,即使二维码出现脏污或部分缺失,仍能正确识别。因而DM码很适合应用在条码容易受损的场景,比如印在暴露在高热、化学清洁剂、机械剥蚀等特殊环境的零件上。
在这里插入图片描述
DM码的纠错复原能力源于数据冗余技术,通过对数据增加冗余部分来保证当数据丢失时能够一定程度上进行恢复。如下图所示,DM码绿色方格代表原始数据,红色代表冗余数据。
在这里插入图片描述
通常的冗余备份机制有两类:一类是完全的数据备份机制,即镜像方法,另一类为纠删码(erasure code)的方法。镜像方法又称为多副本技术,就是把数据复制成多个副本分别存储起来,以实现冗余备份,这种备份方法不涉及专门的编码和重构算法,容错性能好,但存储利用率低,当存放N个副本时,磁盘利用率仅为1/N。纠删码技术主要通过利用纠删算法将原始数据进行编码得到冗余,并将数据和冗余一并存储起来,以达容错的目的。
DM码采用Reed-Solomon编码(里德-所罗门编码)纠错技术,其基本思想给定n个原始数据块(D1,D2,D3,…,Dn),RS编码根据这n个数据块计算生成m个冗余元素(校验块C1,C2,…,Cm)。从这m+n个数据块中任取n个数据块均能解码出原始数据块,即对于n个数据进行RS编码后生成n+m个数据,能够容忍丢失至多m个数据。
实现的功能听上去很强大,其实现原理却十分简单,其很巧妙地运用了矩阵运算的特点。对于需要进行冗余处理的n个原始数据,写成列向量形式(D),左边生成一个变换矩阵,这个矩阵由n+m行和n列组成,其中上面的n×n的部分是一个单元矩阵,保证原数据在编码后不发生变化,下面的m×n的部分是一个范德蒙矩阵,生成冗余纠错数据。使用范德蒙矩阵是为了保证这个矩阵任取n×n都部分可逆。
在这里插入图片描述
假设丢失了m个数据(包括原始数据和纠错数据),比如下图中D1、D4和C2丢失,需要从剩余的n个数据中恢复出原始数据D1 - Dn。从编码矩阵B中删除丢失数据和丢失编码对应行,将剩余的数据挑出来得到新n×n的矩阵B’。因为编码矩阵B的任意n行组成的矩阵都可逆,所以根据剩余的有效数据矩阵,即可把中间原始数据矩阵D解出来了。
在这里插入图片描述
上面的方法理论上能够做到数据冗余处理,不过由于作为一种编码技术,RS编码需要处理的是特定长度的二进制数据,然而求矩阵逆的过程是在实数域中进行的。显然特定长度的二进制是无法准确描述实数的。因此如何构造编码矩阵B成为关键。为了解决这个问题,RS的计算域采用能够用二进制精确编码的伽罗华域GF(2n)(有限域)。与平时熟知的自然域不同,在这个域里会有自己特有的加减乘除等算术规则,是基于多项式运算的,更多参考伽罗华域(Galois Field)上的四则运算。这个域的特性就是非常适合处理[0-2n)范围内数据的四则运算,而且这里的四则运算大都通过位运算处理,效率比较高。实际为了加快计算的过程,通常采用离散傅里叶变换及其逆变换来进行编码实现基于伽罗华域傅里叶变换的RS码识别方法。详细计算参考 ECC之Reed-Solomon算法

四、Data Matrix编码步骤

4.1 生成码字

DataMatrix编码的第一步骤,需要将原始信息转换成DataMatrix的码字,生成的码字范围(0,255)即unsigned char。通常的编码方式为Ascii编码,将原始字符+1即生成码字;同时为了压缩码长,若其中含有连续的两位数字,则将其+130后,生成一个unsigned char。如果要进一步压缩码长,还可以混合其他的编码方式:
在这里插入图片描述

当混入其他方式的编码时,需先插入一个切换字符,如由Ascii切换至C40,则插入230,再切换回Ascii时,则插入254。
编码时,逐一对原始字符进行转换,如以下字符串:ABCDE12,转换后生成码字为:66 67 68 69 70 142。码长为6。
根据码长,查下表规则,确定最终的码长:选择12*12的那一行,其码长为8。由于8-6=2,所以仍需插入2个码字,将其填满(避免生成的二维码出现大面积空白区域)。
ECC200的编码规则如下表:
在这里插入图片描述

计算此2码字:第一个码字为129(填充字符end of message),后面的各位为伪随机码,计算方法为253状态随机算法。公式: pseudorandom(n) = (149 × n) mod 253 + 1,其中n为当前码字的位置(此时=8), pseudorandom+129(mod 254)为最终码字 。故转换后最终码字为:66 67 68 69 70 142 129 56 。

4.2 伽罗华域运算

伽罗华域即有限域,RS编码在此域中进行运算,故不得不对其有所了解。DataMatrix的数据码字、及纠正码字等均是属于GF(2^8) 中的符号,其空间大小为256。有限域的一个特征是,其符号(元素)运算的结果,仍属于该域。除了0、1外,另外254个符号,均由本原多项式P(x)生成,DataMatrix规则中,P(x)=x8+x5+x3+x2+1,设α为P(x)的根,α8+α5+α3+α2+1=0,由于伽罗华域的加法为异或算法,故α8=α5+α3+α2+1。
GF(2^8)符号的表示形式如下:
在这里插入图片描述

4.3 生成纠错码(RS编码)

DataMatrix ECC200采用Reed-Solomon纠错编码来为其提供纠错能力。RS编码的目标是计算出纠错码字,参考表来确定纠错码字的长度,考虑数据码字:66 67 68 69 70 142 129 56(“ABCDE12”通过ASCII编码),长度为8,则纠错码字长度为10,表示为RS(n,k)=RS(18, 8)。
设C(x)为数据码 ,
E(x)为纠错码字 ,G(x)为生成多项式,则:
在这里插入图片描述
在这里插入图片描述
由RS检验码生成多项式的一般形式为:
,
则有:
在这里插入图片描述
X分别取值 ,得到方程组:
在这里插入图片描述
然后用通过高斯消除法计算出E(x)={75 145 55 46 20 95 253 237 62 111},最终生成18位码字{66 67 68 69 70 142 129 56 75 145 55 46 20 95 253 237 62 111}。

参考资料

Data Matrix二维码编码原理及其识别技术
Data Matrix 编码生成和译码原理即方法

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值