今天干点啥子?
这周在看一本计算机基础的书,书中介绍二进制数字系统的时候举了一个例子是关于”通用产品代码(Universal Product Code,UPC)“,也就是我们超市、便利店那些商品上常见的一维码。于是,就有了今天这个“和唯一知道脆司令为什么脆的人散步”的故事。
我们今天的任务是,将早上吃完的脆司令(英文名叫Crispy commander,不叫cui si ling)包装袋上的条形码通过人工的方式进行解码,还原其所表达的实际数值。
提前准备一下资料
与常见的其他行业一样,我们的标准都在继承了拿来主义的指导原则之后,又保持了中国社会主义的特色。所以,尽管在看书的时候作者介绍了UPC的编码标准,我们还得看一下我们的国标,关于定义零售商品编码与条码需要参考的标准主要是**《GB 12904-2008》**,可以从这里下载。国标很简单明了的规定了编码的规则、表示、设计、放置和质量要求,用来支持完成我们今天的任务绰绰有余啦。
咱也分步行动?
解码比把大象装进冰箱里还简单,一共分两步,取码—>解码就是了。
呸!我们正经一点,必须分3步:
- 确定商品的编码规则,熟悉该规则(这里是EAN13);
- 人工读取包装袋上的条形码表示的二进制串内容J(这里借助excel表来完成);
- 根据规则,解码;
解释一下咱们的步骤哈
EAN13的规则如下,其中每个蓝色框代表1个有效字符。根据该规则,我们可以可以解析出一共有11个有效字符,再加上1个校验符号,我们就可以得到12个数值。但是为什么叫EAN13呢?不识数吗?别急别急,这里有一个隐藏字符即后面要用到的前置符,是需要通过校验符和数据符来推
倒导。前置符确定了二进制码到数值的转换关系。人工读取包装带上的条形码,这一步不展示,不会读的多读几遍,读到会为止;
接下来,我们需要推导前置码,我哪会推导呀,大家可以参考一维条形码识别的整个过程原理通俗易懂讲解一文掌握推导前置码;
根据前置码,确定数据段与A、B和C子集中的对应关系,在《国标》中描述“左侧数据符 EAN/UPC 条码字符集的选用规则”,根据下表和前置码即可确定我们当前使用的二进制串和数值的对应关系;
有了对应关系,我们再根据*”表3 EAN/UPC 条码字符集的二进制表“*,人工解码出二进制串代表的数值;
如果成功的话,会得到与二进制码下方一致的数字串,也就完成了今天的任务。
开始分析啦
上脆司令,我从垃圾袋里捡出吃完的脆司令,放在我死贵的电动升降桌上拍了张图,如下;发到电脑,截图,截取其中一行;
新建excel作为度量尺,每一列的宽度等于EAN13码的0/1的宽度,然后对照图片读出数值;
复制出来原始数值:
10100010110011011010011101100110110111000101101010111001011100101011100110110011101001110010101
EAN13编码规则如下:
我们将读出来的数据填入规则,通过其中的中间分隔符,可以看出来,数据没有错位(不代表数据没读错哦);
根据分步行动指南中描述,这里需要根据前置码数值来确定具体的子集对应关系,关于前置码的确认方法,可以参考一维条形码识别的整个过程原理通俗易懂讲解一文,得到我们这里的前置码为6,我们现在就可以确定EAN13 左侧数据符商品条码字符集为如下。另《国标》规定,其余右侧数据符及校验符均用 C 子集表示;
接下来,我们就可以根据”表3 EAN/UPC 条码字符集的二进制表“对我们读到的二进制字符串进行解码,得到实际对应的数值共12位;
920 189 004 290
到这里我们就解码成功,这个编码包含了厂商识别代码、商品项目代码和校验码,可以定位每一类商品。和我预想的不一样的是,*相同的商品分配相同的商品代码, 基本特征相同的商品视为相同的商品。*于是,我迅速拿来了另一袋脆司令,没吃,拍了照。