Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

上卷 数据与编码

数据

数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材。

信息

信息,指音讯、消息、通讯系统传输和处理的对象,泛指人类社会传播的一切内容。人通过获得、识别自然界和社会的不同信息来区别不同事物,得以认识和改造世界。在一切通讯和控制系统中,信息是一种普遍联系的形式。1948年,数学家香农在题为“通讯的数学理论“的论文中指出:“信息是用来消除随机不定性的东西”。创建一切宇宙万物的最基本单位是信息。

信息(百度百科)

数据经过编码等手段加工后得到信息。


上卷概述:为什么从数据与编码开始

在计算机科学的宏大叙事中,数据与编码是最基础、最不可或缺的篇章。正如学习一门自然语言需要从字母和词汇开始,理解计算机世界也需要从数据及其表示方式起步。上卷选择“数据与编码“作为全书的开篇,基于以下考量:

第一,数据是计算的原材料。无论是简单的算术运算还是复杂的人工智能模型,无论是本地文件存储还是分布式网络通信,一切计算活动的起点都是数据。不理解数据的本质,就无法理解计算的本质。

第二,编码是数字世界的通用语言。计算机只能处理0和1,而人类世界充满了丰富多样的信息——文字、图像、声音、视频。编码就是连接这两个世界的桥梁,它将人类可理解的信息转换为计算机可处理的数据,反之亦然。

第三,编码思想贯穿全书。上卷介绍的编码原理不仅适用于数据表示,更是中卷算法设计和下卷密码技术的理论基础。哈希编码、纠错编码、压缩编码——这些思想在后续章节中将反复出现。

数据在计算机中的表示:二进制是一切的基础

1948年,香农发表了《通信的数学理论》,奠定了信息论的基础。在这篇开创性的论文中,香农指出:任何信息都可以被表示为二进制数字序列。这一论断看似简单,却深刻揭示了数字世界的本质。

计算机内部使用二进制(base-2)表示所有数据,原因有三:

  1. 物理实现的简便性:电子元件天然具有两种稳定状态(高电平/低电平、有磁/无磁、有光/无光),用0和1表示最为可靠。

  2. 运算规则的简洁性:二进制算术运算规则远比十进制简单。例如,二进制加法只需记住四条规则(0+0=0, 0+1=1, 1+0=1, 1+1=10),而十进制加法需要记住45条规则。

  3. 逻辑表达的天然契合:布尔代数中的真(True)和假(False)与二进制的1和0完美对应,使得算术运算和逻辑运算可以在同一套硬件上实现。

在Rust中,我们可以直观地看到各种数据类型的二进制表示:

fn main() {
    let n: u8 = 65;
    println!("十进制: {}, 二进制: {:08b}, 十六进制: {:02X}", n, n, n);
    // 输出: 十进制: 65, 二进制: 01000001, 十六进制: 41

    let c: char = 'A';
    println!("字符: {}, Unicode码点: {:04X}", c, c as u32);
    // 输出: 字符: A, Unicode码点: 0041
}

从这段代码可以看出,字符'A'和整数65在底层共享相同的二进制表示01000001。这正是编码的魔力——相同的比特序列,根据不同的解释规则,可以呈现完全不同的含义。

编码的本质:建立映射关系

编码的本质是建立映射关系。具体来说,编码是在两个集合之间建立一一对应(或近似对应)的规则:

  • 字符编码:建立“字符“集合与“二进制数“集合之间的映射。ASCII编码将128个字符映射到0-127的二进制数;Unicode则将全球所有书写系统的字符映射到统一的码点空间。

  • 图像编码:建立“像素颜色“集合与“二进制数“集合之间的映射。RGB编码将每种颜色表示为三个字节(红、绿、蓝各一个字节)。

  • 音频编码:建立“声波振幅“集合与“二进制数“集合之间的映射。PCM编码以固定的时间间隔采样声波的振幅,将连续的模拟信号离散化为数字序列。

  • 视频编码:建立“图像序列“集合与“二进制数“集合之间的映射。由于视频数据量巨大,编码通常包含压缩步骤,利用帧间冗余减少存储空间。

理解编码的映射本质,有助于我们把握各种编码方案的共性与差异。好的编码方案应当满足以下特性:

特性说明
唯一性每个输入有唯一的编码,避免歧义
可逆性编码后能够完整解码还原(无损编码)
紧凑性编码结果尽可能短,节省存储和传输成本
鲁棒性编码包含冗余信息,能够检测或纠正传输错误
高效性编码和解码的计算复杂度在可接受范围内

不同的应用场景对这些特性的侧重不同。例如,文本存储优先保证唯一性和可逆性;网络传输强调紧凑性和鲁棒性;实时音视频则更注重编码和解码的高效性。

信息论简介:香农与信息熵

克劳德·香农(Claude Shannon)被誉为“信息论之父“。1948年,他在贝尔实验室发表了《通信的数学理论》,首次用数学方法定量描述了信息的本质。香农提出的核心概念——信息熵(Entropy),成为衡量信息量的基本单位。

信息熵的直观含义是:一个事件所包含的“惊讶程度“。发生概率越小的事件,一旦发生,带来的信息量越大。例如,“太阳从东方升起“是大概率事件,信息量几乎为零;而“太阳从西方升起“是极小概率事件,一旦发生将带来极大的信息量。

信息熵的数学定义为:

$$H(X) = -\sum_{i=1}^{n} p(x_i) \log_2 p(x_i)$$

其中,$p(x_i)$ 是第 $i$ 个事件发生的概率。信息熵的单位是比特(bit)。

信息熵与编码密切相关。香农证明了:编码一个信息源所需的最小平均比特数,等于该信息源的熵。这就是著名的香农第一定理(无噪声编码定理)。

例如,如果一个信息源只产生两种符号:A(概率90%)和B(概率10%),那么它的熵为:

$$H = -(0.9 \times \log_2 0.9 + 0.1 \times \log_2 0.1) \approx 0.469 \text{ bit}$$

这意味着,理论上我们只需要约0.469比特/符号就能编码这个信息源,远小于直接使用1比特/符号的固定长度编码。这种利用概率分布进行优化编码的思想,正是霍夫曼编码(将在第十三章详细介绍)的理论基础。

信息论的思想不仅适用于数据压缩,还深刻影响了密码学(下卷)、机器学习(中卷)等领域。第二十一章“打包/拆包 压缩/解压“将更深入地探讨信息论在数据压缩中的应用。

上卷各章节内容预览

上卷共十三章,从基础数据类型到复杂编码系统,逐步构建完整的“数据与编码“知识体系:

第一至第四章:数据的原子

这四章关注最基本的数据类型,它们是构建一切复杂数据的“原子“:

  • 第一 数字:计算机如何表示整数和浮点数?为什么0.1 + 0.2 != 0.3?本章从二进制表示出发,讲解原码、反码、补码、IEEE 754浮点标准,以及Rust中的数值类型系统。

  • 第二 字符与编码:从摩斯电码到ASCII,从GB2312到Unicode,从UTF-8到UTF-16。字符编码的发展史是一部人类追求“天下同文“的技术史诗。本章将梳理这段历史,并展示Rust对Unicode的原生支持。

  • 第三 字节:字节(Byte)是计算机存储的基本单位。本章讲解字节序(大端/小端)、位操作、字节缓冲区,以及Rust中Vec<u8>Bytes等类型的使用。

  • 第四 时间:时间是人类最古老的概念之一,但在计算机中表示时间却充满挑战。时间戳、时区、闰秒、夏令时、ISO 8601标准——本章将揭示“时间“背后的复杂性,并介绍Rust的chrono库。

第五至第九章:多媒体数据

这五章将编码思想应用于图像、音频、视频等多媒体数据:

  • 第五 图片:位图与矢量图有何区别?BMP、PNG、JPEG、GIF各自采用什么编码策略?本章从像素出发,讲解图像的数字化表示和常见格式的编码原理。

  • 第六 条码:EAN-13、Code 128、Code 39——一维条码是商品流通的“身份证“。本章讲解条码的编码规则、校验算法,以及如何用Rust生成和识别条码。

  • 第七 二维码:QR Code是二维条码的代表。本章深入QR Code的编码机制:数据模式、纠错等级、掩码模式、定位图案,并展示Rust中的二维码生成与解析。

  • 第八 音频:声音是连续的模拟信号,如何将其数字化?采样定理、量化、编码——从WAV到MP3,从PCM到AAC,本章探索音频编码的技术演进。

  • 第九 视频:视频是图像的时间序列,但视频编码远不止“连续播放图片“那么简单。帧类型(I/P/B帧)、运动补偿、变换编码——本章介绍H.264、H.265等主流视频标准的编码原理。

第十至第十三章:编码的升华

这四章将编码思想提升到更高层次:

  • 第十 万物皆可编码:从DNA序列到地理位置,从情绪表情到区块链交易——本章展示编码思想的普适性,理解“一切皆可表示为数据“的数字化哲学。

  • 第十一 序列化与反序列化:数据需要在内存中高效访问,也需要在磁盘上持久存储、在网络上传输。序列化就是数据结构到字节流的编码,反序列化则是逆向过程。本章介绍JSON、XML、Protobuf、MessagePack等序列化格式,以及Rust中的serde库。

  • 第十二 网络协议:网络协议本质上是通信双方约定的编码规则。从物理层的比特编码到应用层的HTTP报文,本章解析协议栈中各层的数据封装与编码方式。

  • 第十三 压缩算法:数据压缩是编码的“优化版“——用更少的比特表示相同的信息。本章介绍游程编码、霍夫曼编码、LZ系列算法、算术编码等经典压缩算法,以及Rust中的压缩库。

上卷知识图谱

上卷十三章的知识可以用以下层次结构来概括:

数据与编码
├── 基础数据表示
│   ├── 数字(二进制、整数、浮点数)
│   ├── 字符与编码(ASCII、Unicode、UTF-8)
│   ├── 字节(字节序、位操作)
│   └── 时间(时间戳、时区、格式)
├── 多媒体编码
│   ├── 图片(位图、矢量图、图像格式)
│   ├── 条码(一维条码、编码规则)
│   ├── 二维码(QR Code、纠错编码)
│   ├── 音频(采样、量化、音频编码)
│   └── 视频(帧、压缩、视频标准)
├── 高级编码技术
│   ├── 万物皆可编码(编码的普适性)
│   ├── 序列化与反序列化(数据交换格式)
│   ├── 网络协议(分层编码体系)
│   └── 压缩算法(信息熵、无损/有损压缩)
└── 理论基础
    └── 信息论(香农、信息熵、编码定理)

这个知识图谱展示了上卷内容的内在逻辑:从基础到应用,从简单到复杂,从具体到抽象。每一层都建立在前一层的基础之上,形成完整的知识体系。

阅读建议

学习路径

路径一:顺序阅读。对于初次接触数据编码的读者,建议按章节顺序阅读。前四章是基础,务必扎实掌握;第五至第九章可按兴趣选择顺序;最后四章需要前面的知识铺垫,建议放在后面阅读。

路径二:问题导向。如果你已经有一定的编程经验,可以带着具体问题来阅读:

  • “为什么我的浮点数计算结果不准确?” → 第一 数字
  • “如何处理中文乱码问题?” → 第二 字符与编码
  • “如何设计一个高效的数据交换格式?” → 第十一 序列化与反序列化
  • “如何减小我的数据文件大小?” → 第十三 压缩算法

实践建议

  1. 动手实验:每章都包含Rust代码示例,建议读者在本地环境或Rust Playground中运行这些代码,观察输出结果,尝试修改参数。

  2. 对比学习:将Rust的实现与其他语言(如Python、C、Java)进行对比,体会Rust在类型安全、性能、表达能力方面的特点。

  3. 项目驱动:尝试用Rust实现一个小项目,如:二维码生成器、图片格式转换工具、文本压缩程序等。项目驱动是巩固知识的最好方式。

  4. 查阅标准:编码的本质是标准。阅读相关RFC文档(如UTF-8的RFC 3629、PNG的RFC 2083)可以加深对编码原理的理解。

与中卷、下卷的衔接

上卷介绍的编码知识是中卷和下卷的基础:

  • 中卷的哈希(第二十)、排序(第二十三)、神经网络(第三十六)等章节,都需要理解数据的二进制表示。
  • 下卷的对称密码(第四十四)、非对称密码(第四十五)、哈希函数(第四十六)等章节,本质上是特殊的编码——将明文编码为密文,且编码规则依赖于密钥。

因此,扎实掌握上卷内容,将为后续学习打下坚实基础。


数据是信息的载体,编码是数据的灵魂。当我们理解了数据如何被表示、如何被编码,就掌握了打开数字世界大门的钥匙。让我们从上卷开始,踏上“Rust七十二变“的学习之旅。