<< Jackson 框架,轻易转换JSON - hoojo - 博客园 | 首页 | Oracle 数据库隔离级别,特性,问题和解决方法 - 1-2-3 - 博客园 >>

条形码编码原理解析 | AIR20

条形码在我们的日常生活中非常常见。我们平时购买的各种商品,还有书籍上都印有条形码。条形码可以方便商家管理商品的库存,控制售价。物流中运用条形码可以实现快速扫包,将快递发往正确的目的地,免去了人工分拣的麻烦。今天我们就来看看条形码是如何编码的。

首先,条形码的种类很多,不同种类所应用的范围也各不相同。例如买的饮料上印的条形码,和汽车上还有火车票上的条形码显然不是同一种。本文将主要介绍EAN-13条形码。EAN-13(European Article Number)原本是欧洲标准,后来被采纳为国际标准,被广泛世界各国应用在商品编码和书籍编码(ISBN)中。

下图是一个常见的条形码,我们以它为例,来讲讲条形码是如何编码的。

味全麦香味酸牛奶的条形码味全麦香味酸牛奶的条形码

 

首先,我们注意到下面的一串 13 位数字,这是我们要编码的内容。前三位 693 代表是中国大陆生产(690 - 699 都是保留给中国大陆的),紧接着有四位的制造商代码和五位的产品代码,最后一位是校验码,用来检验条码是否有输入错误,详细说明请参考身份证和条形码中的校验码。大家很容易猜到,条形码的存储的信息是通过粗细不同的黑白条纹的不同排列组合来实现的,事实也的确如此,如果用 1 来表示单位宽度的黑色条纹,0 来表示单位宽度的白色条纹,那么条形码可以认为是一个二进制序列,这个二进制序列的长度是 93 位。仔细观察不难发现,在条形码的最左侧、中间和最右侧都有两根稍长的细竖线,分别可以用 101, 01010, 101 来表示。13 位的数字,第一位在最左侧,然后这些竖线将剩余的 12 位分成了两部分 6 位的数码。

在左边的前六位和右边的后六位中,每一位数字都可以由一个长度为 7 的二进制序列表示,每一个数码有三种不同的编码方式A、B、C,如下表所示:

数码 A方式 B方式 C方式
0 0001101 0100111 1110010
1 0011001 0110011 1100110
2 0010011 0011011 1101100
3 0111101 0100001 1000010
4 0100011 0011101 1011100
5 0110001 0111001 1001110
6 0101111 0000101 1010000
7 0111011 0010001 1000100
8 0110111 0001001 1001000
9 0001011 0010111 1110100

若干个连续的 1 表示一个较宽的黑色条纹,而若干个连续的 0 则表示一个较宽的白色条纹。从上表我们不难看出:

  • 每一个数码都是由黑白相间的 4 个条纹构成的并且总长度为 7(满足这样条件的序列有 40 个但只有 30 个用在编码中);
  • 同一个数码的编码方式C和A是互补的,即交换 0 和 1;
  • 同一个数码的编码方式B是C的反序排列。

我们可以先来把最右侧的 6 位进行编码,直接参照编码方式C进行转换即可。021471 对应 42 位的二进制序列:

1110010 1101100 1100110 1011100 1000100 1100110

这样就完成了右半部分的编码,大家可以把编码跟上图对照进行检验。

同时左半部分的 7 位根据前置码(第一位数码)的不同交替使用编码方式A和B进行编码,前置码不参与编码,如下表所示:

首位 第 2 位 第 3 位 第 4 位 第 5 位 第 6 位 第 7 位
0 A A A A A A
1 A A B A B B
2 A A B B A B
3 A A B B B A
4 A B A A B B
5 A B B A A B
6 A B B B A A
7 A B A B A B
8 A B A B B A
9 A B B A B A

味全酸牛奶的条码的第一位是 6,因此接下来 6 位的编码依次采用ABBBAA,参照第一个表,932571 的编码应当为:
0001011 0100001 0011011 0111001 0111011 0011001
将他们放到左半部分,至此,我们的编码就完成了,大家可以对照图片检验一下。有了编码方法,相应的解码也就很容易了,大家可以试一试。

另外现在二维码也很流行,大家可以参照 ISO/IEC 18004 学习二维码的编码原理。

阅读全文……

标签 : ,



发表评论 发送引用通报