主题 1 · 数据表示
文件大小与压缩
从位到 EiB 的存储单位,计算图像和声音文件的大小,以及有损与无损压缩。
存储单位
数据以字节为单位计量。从 KiB 开始,每个单位都是前一个的 1024 倍,因为 1024 是 2¹⁰。
| 单位 | 大小 |
|---|---|
| 位(bit) | 一个 0 或 1 |
| 半字节(nibble) | 4 位 |
| 字节(B) | 8 位 |
| KiB(kibibyte) | 1024 字节 |
| MiB(mebibyte) | 1024 KiB |
| GiB(gibibyte) | 1024 MiB |
| TiB(tebibyte) | 1024 GiB |
| PiB(pebibyte) | 1024 TiB |
| EiB(exbibyte) | 1024 PiB |
考试提示: 往小单位换算就乘以 1024,往大单位换算就除以 1024。从位换成字节就除以 8。
计算文件大小
图像:大小(位)= 分辨率(宽 × 高)× 颜色深度。
一张 1920 × 1080、24 位色的照片:1920 × 1080 × 24 = 49,766,400 位 ÷ 8 = 6,220,800 字节 ÷ 1024 ÷ 1024 ≈ 5.93 MiB。
声音:大小(位)= 采样率 × 采样分辨率 × 时长(秒)。
一分钟、44,100 Hz、16 位:44,100 × 16 × 60 = 42,336,000 位 ÷ 8 = 5,292,000 字节 ≈ 5.05 MiB。
- 1相乘得到位数像素数 × 颜色深度,或每秒采样数 × 位数 × 秒数
- 2÷ 8 得到字节一个字节有 8 位
- 3每升一个单位 ÷ 1024字节 → KiB → MiB → GiB
为什么要压缩?
压缩让文件变小。更小的文件:
- 在设备或服务器上占用更少的存储空间
- 上传、下载和串流所需的时间更短
- 占用更少的带宽,网络更不拥堵
无损压缩
无损压缩在不丢失任何数据的前提下缩小文件。解压后能得到与原来完全一样的文件。它用于文本、程序文件以及每一位都很重要的数据。
游程编码(RLE)是一种无损方法。它把连续重复的值替换为“次数 + 值”。
| 原始数据 | RLE | 存储的值的数量 |
|---|---|---|
WWWWWWBBBWWWW | 6W 3B 4W | 13 → 6 |
AAAAAAAABBC | 8A 2B 1C | 11 → 6 |
ABCD | 1A 1B 1C 1D | 4 → 8(反而更大!) |
有损压缩
有损压缩会永久删除人们不太可能察觉的数据。文件会小得多,但原始数据再也无法完全恢复。它适合照片、音乐和视频,不适合文本或代码。
有损方法包括:降低图像的分辨率或颜色深度,降低声音的采样率或分辨率,以及去掉人耳听不到的声音(MP3 就是这样做的)。
核心概念: 无损:变小,原文件可以完全恢复。有损:小得多,部分数据永久丢失。
关键术语
- KiB
- 1024 字节(kibibyte)。
- 压缩
- 减小文件的大小。
- 无损
- 不丢失数据、能完全恢复原文件的压缩。
- 有损
- 会永久删除部分数据的压缩。
- 游程编码
- 把重复的值存成“次数 + 值”的无损压缩。
自我检测
3 KiB 是多少字节?查看答案
3 × 1024 = 3072 字节。
计算一张 100 × 50、颜色深度为 8 位的图像有多少字节。查看答案
100 × 50 × 8 = 40,000 位 ÷ 8 = 5000 字节。
为什么文本文档不应该用有损压缩?查看答案
有损压缩会永久删除数据,字符会丢失,文本就读不通了。
用 RLE 压缩 RRRRGGGGGGBB。查看答案
4R 6G 2B。