---
schema_version: "library-reader-v1"
source_type: "original_book"
title: "编码 隐匿在计算机软硬件背后的语言"
author: null
edition: null
publisher: null
year: null
isbn: "9787121181184"
library_document_id: "38270854-596f-4a26-8183-db8c968c6020"
source_sha256: "249786274d83909f0bddc34d77f81ed8f0b14d1eac8843c772a37a3ecbfe2cfc"
pdf_physical_page_count: 438
pdf_physical_page_index_base: 0
range_start: 20
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020?start=20&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=20&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=10&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=30&limit=10"
---

# 编码 隐匿在计算机软硬件背后的语言

> 页码规则：PDF_PHYSICAL_PAGE_INDEX 是从 0 开始的权威文件物理页索引；PRINTED_PAGE 是页面中识别出的印刷页码，可能为空，二者不得混用。

## PDF_PHYSICAL_PAGE_INDEX=20 | PRINTED_PAGE=4

我们使用各种不同的编码来为我们自己的交流服务，因为有些编码有时比其他编码更便捷。例如，话语的编码不能存储在纸上，因此，书写的编码就被用来替代话语的编码。如果在黑暗的环境下，而且交流的双方之间有一定的距离，那么通过讲话或者文字来进行秘密的信息交换几平是不可能的，因此，莫尔斯编码就成了一个方便的选择。如果一种编码可以用在其他编码无法取代的地方，那么它就是一种有用的编码。

我们将会看见，各种类型的编码也用在计算机里来存储和传递数字、声音、音乐、图片和电影。计算机不能直接处理人类的编码，因为计算机无法通过与人类的眼睛、耳朵、嘴巴和手指完全相同的方式来接收人类发出的信息。然而，计算机技术的一个最新趋势，已使得我们的个人计算机能够获取、存储、处理和呈现一切用于与人类沟通的信息，无论视觉信息（文字和图片）还是听觉信息（口语、声音和音乐)，或两者的相结合（动画和电影）。所有这些类型的信息都需要它们各自的编码，就像人类说话需要一套器官（嘴和耳朵）而写作和阅读需要另一套（手和眼）一样。

甚至前面所列的莫尔斯编码表，其本身就是一种类型的编码。在这个表中，每个字母由一系列的“点”和“划”来表示。然而实际上我们不能发送“点”和“划”，相反，我们发送与“点”和“划”对应的闪烁光。

当使用手电筒发送莫尔斯编码时，迅速地打开和关闭开关代表一个“点”（快闪)，让闪光时间保持得相对长一些代表“划”（慢速闪光)。例如在发送字母A时，首先以非常快的速度打开并关闭手电，然后再以稍慢的速度进行一次。在发送下一个字符前，需要暂停一会。在此约定，一个“划”的时长是“点”的3倍。例如，如果一个“点”的时长是1秒钟，那么一个“划”的时长就应当是3秒钟。（在现实中，莫尔斯编码的传输速度远比这要快得多)。接收者看到一个短促的闪烁和一个拖长的闪光后，就知道这是一个A了。

在莫尔斯编码中，“点”和“划”之间的停顿是至关重要的。例如，当发送一个字母A时，在发送的“点”和“划”之间，手电筒要关闭一段时间，这相当于一个点的闪烁时长（如果“点”的时长是1秒钟，那么“点”和“划”之间的停顿也应该是1秒钟）。对于同一个单词中的字母，则通过较长的停顿来分隔，这大约相当于一个“划”的时长（或者说是3秒钟，如果一个“划”的时长就是3秒钟的话)。下图以“hello”的莫尔斯编码

编码隐匿在计算机软硬件背后的语言

4

## PDF_PHYSICAL_PAGE_INDEX=21 | PRINTED_PAGE=5

为例，说明字母之间的停顿（间隙）。

单词之间则通过相当于两个“划”的时长来分隔（如果一个“划”的时长为3秒钟，那么这个停顿就应当为6秒钟)。例如下图是“hithere”所对应的编码。

手电筒开和关的时长并没有限定。它们都与一个“点”的时长相关，而这依赖于手电筒开关能以多快的速度扳动，以及莫尔斯编码的发送者能以多快的速度记下一个指定字符。对于一个快速发送者，他的“划”的时长，也许只相当于一个慢速发送者的“点”的时长。这会带来一个小问题，即阅读莫尔斯编码信息会变得很困难，但是经过一两个字母之后，接收者通常就可以分清楚哪一个是“点”，哪一个是“划”了。

乍一看，莫尔斯编码的定义与打字机字母的排列一样都是随意的。这里的定义是指字母表中的字母与各种“点”和“划”的组合序列之间的对应关系。然而，仔细研究之后，我们就会发现事实并非完全如此。简单且短促的编码，被分配给字母表中使用频率较高的字母，例如E和T。拼字比赛选手和“幸运轮”的粉丝们可能会很快意识到这一点。而不太常用的字母，比如Q和Z（这只会让选手在拼字中得到10分）则被分配以较长的编码。

几乎每个人都知道一点儿莫尔斯编码。三个点、三个划，再加三个点就表示SOS，即国际求救信号。SOS不是一个缩写，这只是一个易于记忆的莫尔斯编码序列。在第二次世界大战期间，英国广播公司一些无线电广播以贝多芬第五交响曲的片段来作为节目的前奏—BAH，BAH，BAH，BAHMMMMM，而贝多芬绝不会想到他所谱写的这段乐曲可以表示为莫尔斯编码的V，即胜利（Victory）之意。

莫尔斯编码的一个缺点是，它没有区分大写字母和小写字母。但是除了可以代表字母外，莫尔斯编码还使用一组由点和划组成的五元序列来表示数字，如下所示。

1 至亲密友

5

## PDF_PHYSICAL_PAGE_INDEX=22 | PRINTED_PAGE=6

这些编码至少比字母编码更有规律一些。大部分标点符号由5个、6个或者7个“点”和“划”的组合序列来表示，如下所示。

还有一些编码则用来表示某些欧洲语言中的重音字母，以及用于特殊目的的速记序列。如SOS的编码就是这样的一个速记序列：必须连续地传递这三个字母，而且字母之间只有一个点的停顿时间。

如果有一个专门为此设计的手电筒的话，你会发现和朋友之间通过莫尔斯编码交流将变得更加简单。除了一个可以滑动的开关外，这种手电筒还有一个按钮开关用来控制灯光的明灭。在一些实际应用中，可以达到每分钟传递5到6个单词的速度—虽然这仍比讲话慢得多（讲话的速度在每分钟100个单词左右)，但这已经足够了。

当你和朋友最终熟记了莫尔斯编码之后（这是能熟练地收发编码的唯一方法)，你们甚至可以在口语中使用它，用来取代正常的语言。为了使编码发送的速度最快，你可以把“点”读作“嘀（dib），把“划”读作“嗒（dab”。文字也可以用同样的方式简化成“点”和“划”的序列，莫尔斯编码的口语版把讲话内容缩减到只剩下两个声音了。

问题的关键就在于数字2。两种闪烁，两种声音。事实上，两个不同的事物，只要经过适当的组合，就可以表示所有类型的信息，这的确是千真万确的。

编码隐匿在计算机软硬件背后的语言

6

## PDF_PHYSICAL_PAGE_INDEX=23 | PRINTED_PAGE=NOT_DETECTED

编码与组合

莫尔斯码(MorseCode）是由塞缪尔·莫尔斯发明的（1791-1872)，在本书的其他章节中我们还将频繁地提到他。莫尔斯码其实是伴随着电报机的问世而被发明的，关于电报机，我们在后面也将做详细的探讨。正如通过研究莫尔斯码我们可以很方便地理解编码的本质一样，通过电报机来了解计算机硬件也是个不错的途径。

大多数人都会发现莫尔斯码的发送比接收更为简单。即使你并没有熟记莫尔斯码，也可以很方便地使用下面这张按字母表顺序排列的表格。

比起发送莫尔斯码，接收编码并进行解码要费时费力得多，因为译码者不得不根据一串由“点”、“划”组成的晦涩的编码序列来反查字母。例如，如果你接收到一串形如“划-点-划-划”的编码，那么你就必须从表的第一个字母开始逐个搜寻，直到找到与这串编码相符的字母“Y”为止。

## PDF_PHYSICAL_PAGE_INDEX=24 | PRINTED_PAGE=8

问题就出在这里，因为我们现在只有一张提供“字母→莫尔斯码”的编码表，而缺少一张可以实现反向查询的“莫尔斯码→字母”译码表。在开始学习莫尔斯码的初级阶段，如果有这样的一个表无疑将是很方便的。但是要建立这样一张表，谈何容易。似乎这些字母对应的“点-划”序列并没有什么规律。

所以忘掉字母序列吧。或许根据编码中所包含点、划的多少来对其进行分组，是一个更好的组织这些编码的方法。例如，一个仅包含一个点或一个划的莫尔斯码只能代表两个字母：“E”或“T”。

一组含有2个点或划的编码组合，可以给我们呈现出4个字母—I，A，N和M。

一组含有3个点或划的莫尔斯码可以为我们表示更多的字母。

最后（如果我们不想考虑存在数字和标点符号的莫尔斯码的情况)，一串由4个点或划组成的莫尔斯码就可以表示16个字符。

编码隐匿在计算机软硬件背后的语言

8

## PDF_PHYSICAL_PAGE_INDEX=25 | PRINTED_PAGE=9

综合以上数据来看，这四张表包含了2+4+8+16组码字，总共表示了30个字母，比拉丁字母表的26个字母还要多出4个。所以，你会注意到最后一个表中有4组编码是用来表示重音字母的。

当有人给你发送莫尔斯码的时候，上述四张表可能会让你的解码工作变得轻松很多。当接收到某一代表特定字母的码字后，你就可以知道其中所包含的“点”和“划”的数目，那么你至少可以很快找到对应的表格去进行查找。每个表格都组织得很规整，全部是“点”的码字被排在左上角，而全部是“划”的则被排在右下角。

你发现这四张表格在大小上的规律了么？注意看，每个表格所包含的码字数目都是前一张的两倍。这其实很好理解：每个表格所含有的码字，可以看成是在前一张表格所包含的全部码字上再加一个“点”，或者再加一个“划”而组成的新码字。

我们可以用如下这样一个列表来总结这个有趣的规律。

在这四个表中，每张表的码字数都是前一张表码字数量的两倍，因此如果第一张表含有2个码字，那么第二张表则含有2×2个码字，而第三个表就有2×2×2个码字。下面用另一种方式呈现这个规律。

当然，如果我们遇到了数字的自乘，就可以通过幂的方式来表示它。例如，2×2×2×2可以记作 $2 ^ { 4 }$ (2的4次幂)。数字2、4、8和16都是以2为底数的幂值，因为你可以通过使其自身乘2来得到它们。由此我们的总结列表也可以写成下面这种样子。

2 编码与组合

9

## PDF_PHYSICAL_PAGE_INDEX=26 | PRINTED_PAGE=10

现在这个表已经变得很简洁了。如果知道了码字中“点”和“划”的数目，那么以这个数目为指数的2的幂运算结果就是其总共可以表示的码字数。我们可以用下面这个简单的公式来概括上述表格所表示的内容：

$$
A B = \frac { 1 } { 2 } A B = \frac { 1 } { 2 } A B = 2 = 2 ^ { - \frac { 1 } { 2 } \cdot \frac { 1 } { 2 } \cdot \frac { 1 } { 2 } \cdot \cos \alpha + \sin \alpha }
$$

使用2的幂值的形式可以表示很多码字，在下一章中，我们还将接触另外一个例子。

为了让莫尔斯码的解码过程更加简单，或许画张图会有所帮助，例如下面这张树型图。

这张图给出了所有字母及其所对应的由“点”和“划”组成的连续序列。当对一串码字进行解码时，我们需要沿着箭头从左向右进行搜寻。以“点-划-点”的码字为例来说，当你需要找出这串码字所代表的字母时，应首先从图的左边开始，选择“点”的分支；然后继续沿着箭头向右选择“划”，接着又是一个“点”。找到最后一个“点”时结果就会紧随其后出现了，没错就是字母“R”。

编码——隐匿在计算机软硬件背后的语言

10

## PDF_PHYSICAL_PAGE_INDEX=27 | PRINTED_PAGE=11

的。首先。它确保了我们不会对不同的字母定义相同的码字。其次，通过这个表我们可以用尽可能短的码字来表示所有的字母，而避免产生编码长度上的浪费。

我们可以继续加长码字至5位或者更长，不过这可能超出页面打印边界。一串由5个“点”或“划”组成的编码串可以为我们提供32 $2 \times 2 \times 2 \times 2 \times 2$ ，或 $2 ^ { 5 } )$ 种扩展的码字。对干莫尔斯码中定义的10个数字和16个标点符号来说，通常这已经足够了，而实际上数字确实就是使用5位的莫尔斯码来表示的。但是在很多其他编码方式中，5位码字常用来表示重音字母而不是标点符号。

为了把所有的标点符号也都包含进去，编码系统必须要扩展到6位了！扩展后将为我们提供 $6 4 ( \ 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2$ ，即 $2 ^ { 6 }$ ）种新增的码字，这样总共的码字就达到了$2 + 4 + 8 + 1 6 + 3 2 + 6 4$ ，也就是126种！这对莫尔斯码来说有点太多了，甚至还留下了很多“未定义”的码字。这里“未定义”用来表示那些不代表任何字符的码字。如果你在接收莫尔斯码的时候收到了一个未定义码字，可以肯定发送方一定是出了差错。

我们很容易就能得到这样一个小公式：

$$
5 1 7 \div 5 \cdots 5 5 5 5 5 = 2 \cdots 5 5 5
$$

利用它就可以继续计算出更长位数的点划序列所能表示的码字数目了。

幸运的是，我们并不需要写出所有可能的码字来计算码字的总数目。我们需要做的只是让2不断地与自己相乘。

2 编码与组合

11

## PDF_PHYSICAL_PAGE_INDEX=28 | PRINTED_PAGE=12

莫尔斯码也被称作二进制码(Binary Code)，因为这种编码的组成元素只有两个“点”和“划”。这跟硬币有些类似，因为硬币落到地上只能是正面朝上或反面朝上。二元对象（例如硬币）和二进制码（例如莫尔斯码）常常使用2的乘方来进行描述。

上面所做的关于二进制编码的分析工作，其实是数学的一个分支，称作“组合学”或“组合分析”，而我们所作的分析则只能说是一个简单的练习。传统意义上来说，因为组合分析涉及类似像扔硬币、掷骰子这样的需要对其组合数目进行推算的问题，所以它经常被应用到概率和统计学中。但是它对于我们理解码字的组合与分解也是十分有帮助的。

编码隐匿在计算机软硬件背后的语言

12

## PDF_PHYSICAL_PAGE_INDEX=29 | PRINTED_PAGE=NOT_DETECTED

布莱叶盲文与二进制码

塞缪尔·莫尔斯并不是第一个将书面语言的字母成功编码的人。实际上，在因自己的名字被用来命名某种编码方式而名声大噪的人中，莫尔斯先生也不是第一人。这项荣誉应该归一个法国盲人小伙子所有。尽管他比莫尔斯要晚出生18年，但是他很早就创建了自己的编码规范。他的生平鲜为人知，尽管关于他的故事流传至今的为数不多，但这也足以构成一个引人注目的传奇。

路易斯·布莱叶（LouisBraille)于1809年生于法国的库普雷，这是一个距离巴黎市东只有25英里的小镇。布莱叶的父亲是一个马具匠人。在布莱叶3岁的时候个本不该在父亲的工作间玩耍的年纪他不小心被一个尖锐的工具刺伤了一只眼睛。伤口感染也影响到了他的另外一只眼睛，最后使他的双目完全失明。按常理，布莱叶将在无知和贫困当中度过自己的一生（就像当时大部分盲人那样)，但是小路易斯对知识的渴望和过人的智慧很快被人们所发现。他最初同其他孩子一样在镇上的小学上学，后来在他10岁的时候，在小镇牧师和一名学校老师的帮助下，布莱叶被送往巴黎皇家盲人学校学习。

3

下一段：[继续读取](https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=30&limit=10)
