司可能是指一种完全不同的产品。
与大家通常的想法相反,UPC不包含物品的价格信息。价格信息可以从商店使用的与该扫描仪相连的计算机中检索到。
最后一个数字(在这里是7)称为模校验字符。这个字符可用来进行另外一种错误检验。为了了解它是如何工作的,我们将前11个数字(在这个例子中是05100001251)各用一个字母来代替:
A BCDEF GHIJK
然后,计算下式的值:
$$
3 \times ( \mathbf { A } + \mathbf { C } + \mathbf { E } + \mathbf { G } + \mathbf { I } + \mathbf { K } \mathbf { \Omega } ) + ( \mathbf { B } + \mathbf { D } + \mathbf { F } + \mathbf { H } + \mathbf { J } )
$$
从离这个值最近并且大于或等于它的一个10的整倍数中减去它,其结果称为模校验字符(modulo check character)。在 Campbell 鸡汁面的例子中,有:
$$
3 \times ( 0 + 1 + 0 + 0 + 2 + 1 ) + ( 5 + 0 + 0 + 1 + 5 ) = 3 \times 4 + 1 1 = 2 3
$$
紧挨23并大于或等于23的10的整倍数是30,因此:
$$
3 0 - 2 3 = 7
$$
这就是印在外包装上并以UPC形式编码的模校验字符,这是一种冗余措施。如果扫描仪没有扫描到与计算机计算结果相同的模校验字符,那么计算机就视这个UPC无效。
通常情况下,要表示0\~9的十进制数字只需要4个比特位就足够了。UPC中每个数字用了7个比特位。这样,UPC总共用了95个比特位来表示11个有效的十进制数。实际上,UPC中还有空白位置(相当于9个0比特),它们位于左、右护线的两侧。这就意味着,整个UPC需要113个比特位来编码11个十进制数,平均每个十进制数所用的比特位超过了10个!
如我们所看到的,有部分冗余对于检错来讲是必要的。这种商品编码如果能够被顾客用笔轻易地改动,那么这种产品编码措施也就没有任何意义了。
UPC可以从两个方向读,这一点是非常方便的。如果扫描装置解码的第一个数是符合偶校验(即7位编码中有偶数个1)的,扫描仪就会知道,它正从右向左扫描UPC码。
编码——隐匿在计算机软硬件背后的语言
86