《编码》读书笔记 —— 二进制与条形码

2018-02-25  本文已影响230人  纸简书生

语言不过是一种编码。中文的猫,英文叫cat,其他语言叫法又不一样。而数字并不是随文化不同而改变,甚至可以把数字称为地球上的一种通用语言。虽然数字是一种抽象代码,但当我们看到100的时候可能会想到100的毛爷爷,也可能想到100个美女。具体100指代的是什么跟上下文有关。

上下文这个概念在计算机中以及编程中都很重要。简单来理解指当时的环境、发生的背景、或者语义。

在数字中,0这个数字具有非凡的意义,延续到今天的罗马数字一共有I-1,V-5,X-10,L-50,C-100,D-500,M-1000。没有0这个符号。而阿拉伯数字系统中有。它支持位置计数法。因此25,205,250区分开。也简化了数字系统中的一些运算,尤其是乘法和除法。

举个例子在十进制中。4825读作四千八百二十五,4825= 4 * 1000 + 8 100 + 2 * 10 + 5 * 1这种方式可以后面会扩展到二进制中。*

为什么生活中一直使用的是十进制呢。简单来讲因为人有10只手指,已经适应了这种10进制为基数的数字系统。如果人不是十只手指,比如卡通人,可能用四进制,而至于海豚则用二进制。

进制之间的关系这里就不讲了。

小时候背过十进制的加法表和乘法表。十进制情况很多。而对于二进制来讲就会简单很多。
二进制加法:



二进制乘法



所有情况无法只有0和1的出现。

将数字系统减少只有0和1两个数字的二进制系统是最简单的数字系统,此外二进制数字系统的算术海域电子技术之间架起了桥梁,这也是后面计算机兴起的根本原因。之前我们看到的开关(接通为1,关闭为0),导线(有电流通过为1,没有则为0),灯泡(点亮为1,没点亮为0),还有继电器(闭合为1,断开为0)这些物体,都可以用二进制表示。

利用二进制表示信息的一个额外好处就是可以清楚的知道是否考虑到了所有的可能性。只要二进制位数够多,就能够表示所有信息。

条形码

接下来以条形码为例,讲讲条形码和二进制的关系。

虚构个例子,以下是康师傅方便面的条形码


表面上看条形码由一粗一细的线条及中间宽窄的间隙组成。换个角度来看。比如从上往下看会看到如下这段:



看起来像莫尔斯码。有这个感觉就对了。

当计算机从左往右扫描这个信息的时候,它会给遇到的第一条黑条分配一个值为1的bit,给相邻的白色间隔分配值为0的bit。随后条纹和间隙被读作一行中的一系列bit。每个系列的bit可以是1、2、3、4位。位数取决于条纹和空隙的宽度。

比如之前的二维码可以翻译为


二进制分组(和网络传输中的报文分组类似,一段二进制代表什么意思)

护线:前三位通常是101标识最左边的护线,从护线可以确定单个比特的条和空隙的宽度。这样条形码的大小就可以不固定了。

6组比特串:从护线之后就是6组比特串,每串含有七个比特位。其中每一组数字都是0到9之间的一个数(可能会很奇怪为什么,0到9要用七个比特位标识。这是为了校验)。接下来是5比特的中间护线。这是一个固定的模式始终是(010110),默认内置的检错码。

整体来讲之前的条形码二进制分组如下:


对应到数字,我们解码出来,可以得到左边的意思和 右边的意思

在解码之前需要用到解码表。假设现在的解码表如下:


注意到几个特点,1的个数为奇数个,这叫奇校验。在网络中也有什么奇偶校验,其实和这样代表的意思一样。如果1的个数为偶数个就是偶校验。

现在开始解码得到如下结果的12个数字:

最终和条形码下面的数字一样。这是为了防止条形码扫描不了,可以通过输入输入数字确定商品。

12个数字代表含义不同(对应到网络传输中就好比什么请求头信息什么的,根据具体字节范围确定)。

至于最后一个7使用来模检验的字符。

这个条形码总共用了95个比特位来标识11个有效的十进制。如果要加上空白的位置相当于9个0比特,它位于左右线两侧。这一位置一共用了113个比特位来编码11十进制数,每个十进制数所用比特位超过10个。本来要表示0到9只需要4个比特位就够了。这是为了进行检验而设计的。从条形码中可以看到部分的冗余位对于检错来讲是非常必要的。

写在最后

接下来的几篇将正式进入烧脑系列。涉及到电子电路、半加器,全加器、触发器这些。准备好咯!老司机准备发车。

扩展阅读

计算机校验码分类及原理
校验和算法分析

上一篇 下一篇

猜你喜欢

热点阅读