常见编码技术总结¶
1. 字母表编码¶
A-Z/a-z 对应 1-26 或 0-25,将字母映射为数字序号。
2. ASCII 编码¶
将字符映射为 0-127 的十进制数值。
| 字符范围 | 十进制 |
|---|---|
| 0-9 | 48-57 |
| A-Z | 65-90 |
| a-z | 97-122 |
变体¶
- 二进制编码:将 ASCII 数值转为二进制(7 或 8 位)。
- 十六进制编码:将 ASCII 数值转为十六进制(如
A→0x41,a→0x61)。 - 八进制编码:将 ASCII 数值转为八进制。
3. Base 系列编码¶
Base N 使用 N 个可打印字符进行编码。
Base64¶
- 使用 64 个字符(A-Z、a-z、0-9、
+、/),2^6 = 64,每 6 bit 为一个单元。 - 3 字节(24 bit)编码为 4 个 Base64 字符。
- 不足 3 字节时补 0,编码后末尾加
=填充(最多 2 个=)。 - 常用作邮件传输编码、Data URI、密钥存储等。
Base32¶
- 使用 32 个字符(A-Z、2-7),2^5 = 32,每 5 bit 为一个单元。
- 5 字节(40 bit)编码为 8 个 Base32 字符。
- 不足 5 字节时补 0,末尾用
=填充(最多 6 个=)。
其他 Base 编码¶
- Base16(Hex):每 4 bit 为一个单元,使用 0-9、A-F。
- Base85(Ascii85):使用 85 个字符,编码效率更高,常见于 PDF 和 Git 二进制 patch。
- Base58:去除容易混淆的字符(0、O、I、l),用于比特币地址等场景。
- Base62:0-9、A-Z、a-z,用于短链接等场景。
4. URL 编码(百分号编码)¶
将非 ASCII 字符和保留字符转换为 %XX 格式(XX 为十六进制值)。
- 空格 →
%20或+ - 常用于 HTTP 请求参数传递。
5. Unicode 编码¶
Unicode 字符的四种常见表示形式:
| 形式 | 示例(The) |
|---|---|
&#x [Hex] |
The |
&# [Decimal] |
The |
\U [Hex] |
\U0054\U0068\U0065 |
\U+ [Hex] |
\U+0054\U+0068\U+0065 |
常见 Unicode 编码方案: - UTF-8:变长编码,1-4 字节,兼容 ASCII。 - UTF-16:2 或 4 字节,分 LE/BE(小端/大端)两种字节序。 - UTF-32:固定 4 字节。
6. HTML 实体编码¶
HTML 中使用特殊字符串表示字符:
- 命名实体:
<(<)、>(>)、&(&)、"(")、 (空格) - 数字实体:
<(十进制)、<(十六进制)
7. XXencode¶
与 Base64 类似的编码方式,每 3 字节编码为 4 个字符,字符集为:+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz。
8. UUencode¶
Unix-to-Unix 编码,用于在 Unix 系统间传输二进制文件。与 Base64 类似,但字符集不同(从空格开始的可打印字符)。现代多被 Base64 取代。
9. Quoted-Printable 编码¶
用于电子邮件编码,可打印 ASCII 字符保持不变,非 ASCII 字符用 =XX 表示。末尾软换行用 = 标识。
10. 摩尔斯电码(Morse Code)¶
用点(.)和划(-)表示字符:
A→.-SOS→... --- ...
11. 敲击码(Tap Code)¶
基于 5×5 网格的编码方式,用敲击次数表示行和列:
| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| 1 | A | B | C/K | D | E |
| 2 | F | G | H | I | J |
| 3 | L | M | N | O | P |
| 4 | Q | R | S | T | U |
| 5 | V | W | X | Y | Z |
12. 霍夫曼编码(Huffman Coding)¶
变长编码,根据字符出现频率构造最优二叉树进行编码。常用于数据压缩(如 ZIP、JPEG)。
- 高频字符使用短编码,低频字符使用长编码。
- 是一种前缀编码(任一编码都不是另一编码的前缀)。
13. 条形码(Barcode)¶
用宽度不等的黑白条按规则排列表示信息。
| 类型 | 字符集 | 说明 |
|---|---|---|
| EAN-13 | 13 位数字 | 国际通用商品条码 |
| Code-39 | 39 字符 | 字母数字条码 |
| Code-128 | 128 字符 | 高密度条码 |
| PDF417 | 堆叠式 | 二维条形码 |
14. 二维码(QR Code)¶
用黑白相间的几何图形在二维平面上记录信息。
- QR Code:最常见,支持数字、字母、汉字、二进制。
- Data Matrix:小尺寸高容量,常用于电子元件、票据。
- PDF417:堆叠式二维码。
- 支持纠错等级 L/M/Q/H。
15. Punycode¶
将 Unicode 域名编码为 ASCII 兼容格式,用于国际化域名(IDN)。
中文.com→xn--fiq228c.com
16. Shellcode / 转义编码¶
编程语言和 shell 中的转义表示:
| 形式 | 示例 | 说明 |
|---|---|---|
\xNN |
\x41 → A |
十六进制 |
\NNN |
\101 → A |
八进制 |
\uNNNN |
\u0041 → A |
Unicode(JS) |
\x{NN} |
\x{41} → A |
Perl 风格 |
17. JSFuck / AAEncode / JJEncode¶
基于 JavaScript 的混淆编码:
- JSFuck:只用
[]()!+六个字符构造任意 JS 代码。 - AAEncode:将 JS 代码编码为颜文字风格。
- JJEncode:将 JS 代码编码为特殊符号组合。
18. 其他编码¶
| 编码 | 说明 |
|---|---|
| Baudot 码 | 5 bit 电传打字机编码,电报通信历史编码 |
| EBCDIC | IBM 大型机的字符编码 |
| GSM 7-bit | 手机短信默认编码,160 字符限制即基于此 |
| ROT13 | 字母旋转 13 位,A↔N,常用于论坛隐藏剧透 |
| Brainfuck | 极简编程语言,><+-.,[] 八个字符 |
编码识别技巧¶
- 有大量
%→ URL 编码 - 以
=结尾,只有字母数字和+/→ Base64 - 只有
A-Z和2-7,可能有多个=→ Base32 - 只有
0-1,长度 7 或 8 的倍数 → 二进制 ASCII - 只有
0-9、A-F→ 十六进制 - 有
&#和;→ HTML/Unicode 实体编码 - 有
.和-→ 摩尔斯电码 - 以
+-开头的字母数字串 → XXencode