传纸条被发现,一看竟写着…

  • 2019 年 10 月 8 日
  • 筆記

不知道大家以前有没有用过 / 见过这个玩意…

小编小时候写的一本笔记一直保存到了现在…

当年偷偷写的日记和小秘密,为了防止被同学老师家长偷看,都写在这样的本子里面。这种本子的密码少则四五位,多的有七八位,除非知道这个密码锁的密码,不然根本无法打开。

上学的时候谁又没有在课上偷偷地传过小纸条呢?可能很多人还挺享受那种在老师眼皮子底下偷偷摸摸说悄悄话的快感。其实说起来,这种「传纸条」应该也算是大家最早的对保密通讯的需求了。为了防止传纸条的途中被其它同学截获获取里面的内容,可能有的人还要用密码来加密一下。

传纸条前记得确认一下…

从通信的角度来讲,一个好的编码方案可以在有效传输信息的同时大大降低传输所需要的代价。怎么才能科学地理解通信和编码,以下小编将从字符编码的角度来介绍几种历史上著名的编码方案以及信息熵的概念。

摩尔斯电码

Morse Code

1837 年,美国人塞穆尔·摩尔斯 (Samuel Morse) 发明了电报,并和艾尔菲德·维尔 (Alfred Ville) 一起,共同发明了一套电码以供电报配套使用。这套电码就是赫赫有名的摩尔斯电码 (Morse alphabet)。

这种古老而简单的信号代码主要由两种基础信号组成:短促的电信号「·」(读作「嘀」)和保持一定时间的长信号「 —」(读作「嗒」)。电影电视剧里勤奋的发报员每天嘀嘀嗒嗒响个不停就是在发电报。

勤奋的发报员在发电报

按照点码表所列出的组合,摩尔斯电码可以构成不同的字符,比如字母、数字和常用的标点符号:

摩尔斯电码表

这些字符串连起来就组成了单词,单词串连变成句子。

每个不同的单位之间需要一定的停顿时间,否则就会引起歧义。比如“h”是“····”,而“i”是“··”,如果没有停顿,连续两个“i”就会是“····”,跟“h”就混淆了。

不同单位之间停顿的时间不相同。嘀=1t,嗒=3t,嘀嗒间=1t,字符间=3t,单词间=7t。

简易电报机

著名的国际通用海滩求救信号就是采用摩尔斯电码,运用灯光(比如手电筒)向远处发射三短三长三短的光,即“··· ——— ··· ”。换成对应的字母也就是“SOS”。至于为什么要采用这样的一组光——当然是因为最简单最容易辨识啊!

阅后作业:请对小编说出以下摩尔斯电码的解码文:

·—·· ·· ···· ·— ·· ·—·· ·

ASCII 码

ACSII Code

20世纪,随着计算机的诞生,编码在应用阶段上获得了迅速的发展。由于笨笨的计算机只能存储二进制数(高电平为1,低电平为0),人们决定开发一套通用的二进制编码规则来相互通信。

就这样,由美国国家标准学会制定的 ASCII (美国信息交换标准代码,American Standard Code for Information Interchange) 应运而生。

ASCII 码能够用 7 个比特来表示不同的字符。每个 bit 可以有 0 和 1 两种状态,因此 7 位二进制数能够表示 128 种不同的字符,也就是表中的前面 0~127 种。里面包含了所有英文文字表达所需要的字符,英文国家们表示很满意。

但这远远不能满足广大的非英文国家的需求。他们表示很不开心并增加了一个比特的位置,占领了后面的 128 个空位。于是,从 128 到 255 的这 128 个字符被用来表示他们的字母、符号和形状,这些被称为「扩展字符集」

图中码值为十进制形式,计算机里的形式是对应的二进制数

即使后来产生了各种花里胡哨的计算机编码规则,ASCII 码以其优秀的实用性,仍然保留了下来。它通常保留在各种编码规则的最开头,占据最前面的 128 个位置。

在人看来非常简单的单词,在计算机眼中就变成了一大堆 0 和 1 的组合。当然,由于计算机拥有强大的处理能力,这些数字也并不成问题。

阅后作业:参考下图,解码以下 ASCII 码文(一行一字):

01101110 01101001

01101000 01100101 01101110

01111001 01101111 01110101

01111000 01101001 01110101.

GBK 标准

Chinese Internal Code Specification

后来,计算机终于来到了中国人民的手中。然而,大家发现 ASCII 码的 256 个坑位已经全部被占用了。

但汉字总不能都用拼音表示吧,广大 l n 不分的南方人民表示不同意。。。

于是,优秀的中国选手自己制定了一套叫做 GBK(汉字内码扩展规范)的编码方案,用两个字节来表示一个汉字。

对于当时的计算机而言十分复杂的汉字 @井口皓太

这套规则兼容了前面的一些编码方案,用后面空余的位置收录了 21003 个汉字,日常使用完全够够的了~

不过,当时想要在电脑上显示汉字,就必须装上一个汉字系统。而当时的大多数人对电脑仍然是一窍不通的,回去装系统发现全是 bug 而且看都看不懂。。。

而且,不同的国家都开发了一套自己的编码方案和文字系统,导致不同国家的人之间无法互相通信。因此他们制定了一套统一的编码规则——Unicode

Unicode 码

Unicode

Unicode 又称万国码、统一码,为解决传统字符编码方案的局限而产生。听起来就很厉害有没有!

它把所有语言的字符都统一到一套公用的编码,有一百万多种字符,就像是一部世界语言通用字符字典。因此,在 Unicode 中,一个字符需要用三个字节来表示

像一些简单基础的字符,比如 a、b、c 等等,1 个字节就能够表示了。但是按照 Unicode 的规则,计算机必须再读取两个空字节填充在高字节位。比 GBK 多 1 个字节,比 ASCII 多 2 个字节。。。

所以这个神级装备还不如新手装备的吗。。

用来扩展字符编码的 Unicode 在处理一些简单的字符时遇到了麻烦 @叶天宇yetianyu

于是,智慧的人们不堪其辱地研发了 UTF-8 这种专门针对 Unicode 的可变长度编码。它将Unicode 编码进行再编码,再进行传输,可以自动变长节省空间。

UTF-8 也成为现在程序猿们钟爱的一种编码形式啦~

信息熵

Information Entropy

在上面的内容中,我们介绍了很多编码的内容。但是同一份内容,无论用什么编码来进行「叙述」,其本身所包含的信息应该是不变的。

信息,时间与知识 @ alcrego

在信息论中,人们使用(entropy)来度量接收到的每条消息中包含的信息的平均量,这也被称为信息熵、信源熵等。这里的「消息」其实已经不是我们日常发条微信,发条语音的那种消息了,而是可以更广泛地理解为一件事情发生的概率分布,或者数据中的事件、样本或者特征。

和热力学里面的熵类似,这里的信息熵同样可以理解为对不确定性的一种度量,因为一个消息来源越随机,那么它的熵就越大。就像投掷一枚硬币,其正反面出现的概率都相同,那么这时候它的熵就最大。反之,如果这枚硬币很特殊,它的正面更重一些,因此在投掷以后,它正反两面出现的概率不再一致,它的熵就会减小。这里的想法很简单,因为正反两面概率不再一致,这里发生了以前不会发生的事情,给我们提供了更多的信息,减少了不确定性。

抛一枚硬币决定生死,虽然人们总想要在消除不确定性以后往好的那一面发展,但现实却不一定。。。

在很多人见到信息熵的定义的时候一定都会有疑惑,明明是挺简单的一个概念,为啥计算的公式这么复杂呢?又是对数又是相乘还要求和。

信息熵计算规则

How to calculate entropy

其实藏在这个公式的背后的假设非常简单:1. 信息熵的单位。2. 可加性。

无论怎么定义信息熵,我们都需要一个单位。一般情况下我们选取的单位为 bit,比特。也就是 H2(1/2, 1/2) = 1。实际上,信息熵的定义函数对于连续性也有一定的要求。对系统施加微扰,假设拋一枚硬币正面朝上的概率变为了 0.50000001,而反面朝上的概率变为了 0.49999999。那么此时抛硬币这件事情包含的信息熵应该还是约为 1 bit。而不会变成 2 bit 或者其他的数值。用数学化一点的语言来说就是,H2(p, 1-p) 是关于 p 的连续函数。

丢两枚硬币的情形

在有了信息熵的单位以后,我们还需要知道不同系统之间的信息熵是怎么相加的,就像小时候学加法的时候老师教小朋友 2 个苹果加 3 个苹果等于几个苹果一样。只不过这里关于信息熵的「加法公式」,会稍微比起 2 + 3 = 5 麻烦一点点。

我们需要明确不同系统之间的信息熵是怎么计算的

对不同系统的信息熵进行求和的过程可以这么理解,还是用抛硬币这个例子,只不过我们这时候要拋两个硬币了。当然,我们希望信息熵的定义能够保证这时候对应的为 2 bit。那么能不能做到呢?我们先完全不管第一枚硬币的正反结果,因为对于第一枚硬币的情况一无所知,那么这时候的系统其实就相当于只拋一枚硬币了,当然此时的信息熵就是 1bit。此时我们再单独看第一枚硬币带给我们的信息熵,其同样为 1bit。所以在信息熵的定义过程中,要让其具有系统的可加性。也就是

Hm(p1…pm) = Hm(p1+p2, …pm) + p H2(p1/p, p2/p)

其中 p = p1 + p2.

在有了这两条以后,我们就能推导出信息熵的公式只能是上面对数的形式了。[6]

那些说不完的秘密

Other Interesting Stories

熵的故事其实最早要从物理上开始说起,其度量了分子的微观状态的混乱程度。

何谓「混乱」?

在信息的世界中,熵越高,其可能性越多,则能传递越多的信息;熵越低,其可能性越低,则能传递的信息越少。比如你说了一句话,「今晚夜色真美」,里面包含了很多的可能性,熵比较高,我们一般就可以说这句话「信息量很大」。

不过我们日常生活中对于信息,或者信息量很大还有另外一种理解。熵是对不确定度的度量,获取信息等于消灭熵。就像你读了「中科院物理所」推送的文章一样,学到了很多东西,信息量很大。这个其实并不是说我们文章模棱两可,充满了可能性,而是在说你心里对一些事物是比较模糊的,在阅读完文章以后,消灭了这种模糊性,获得了信息。

回到我们前面叙述的那么多编码中来,一段数据经过编码以后被无损地压缩了,信息不变,但是长度变短了,这也就意味着我们更难预测每个字符的下一个字符,因此它的信息熵会增加。因为一个固定长度的消息其信息熵有上限,这也就是说消息压缩存在着上限,我们不能无限制地对消息进行压缩

如果不断地用压缩软件去压缩一个文件,我们甚至会发现压缩包会变得越来越大。

在信息熵的背后还有点小故事。在香农提出这个概念以后,冯诺依曼发现了其与物理学上的热力学熵概念存在相同之处,从而建议香农取名为「信息熵」。不过也有传闻说取这个名字的理由是这个热力学名词别人不懂,容易被唬住。[7]

* 图片均来源于网络

* 参考文献与链接:

[1] 摩斯密码到底是怎么回事?普通人能学会吗?

[2] 百度百科 – ASCII码

[3] 最为透彻的utf-8、unicode详解

[4] Unicode 编码理解

[5] 字符编码的故事

[6] 关于这中间推导的细节详见 Handout Mode 的 Application of Information Theory, Lecture 1, Basic Definitions and Facts,该文档里面还介绍了信息熵定义的其它一些性质以及证明。Witten 在去年也写过一个关于信息熵和信息理论的简短介绍(A Mini-Introduction To Information Theory),里面有和物理联系的更紧密一些的例子,并介绍了信息熵量子化的版本和应用,详见 arXiv:1805.11965

[7] Information Entropy – wikipedia

编辑:Cloudiiink