Base36
Base36是一个二进制到文本编码表示方案的二进制数据以ASCII通过将其转化为一个字符串格式基数 -36表示。选择36十分方便,因为可以使用阿拉伯数字 0–9和拉丁字母 A–Z [1](ISO基本拉丁字母)表示数字。 每个base36位需要少于6位的信息来表示
base36¶
(1) 核心思想¶
每个base36需要少于6位的信息来表示。
字符集:共有 36 个字符。
- 数字:0,1,2,3,4,5,6,7,8,9
- 字母:A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
- 无填充字符:与Base64 以及Base32 不同,Base36 编码之后通常不需要填充字符来对齐。
- 值得注意的一点是,由于base系列的编码的字典表都是可以自定义的,如果在base36中,将大学字母转化为小写,A,a都是代表10。
(2) 具体流程(编码)¶
先去建立字符与数值的对应关系:
- 0 - 9 对应映射 0 - 9
- A - Z 对应 10 - 35
执行连续除法:
我们将要编码的字符,按 UTF-8 编码成字节序列,然后将字节序列视为一个大整数(大端序)
示例:¶
编码**AB123**
字节序列(十六进制):41 42 31 32 33 转十进制整数: $$ 0x4142313233 = 0x41 * 256^4 + 0x42 * 256^3 + 0x31 * 256^2 + 0x32 * 256^1 + 0x33 = 65 * 4294967296 + 66 * 16777216 + 49 * 65536 + 50 * 256 + 51 = 279172874240 + 1107296256 + 3211264 + 12800 + 51 = 279172874240 + 1107296256 = 280280170496 280280170496 + 3211264 = 280283381760 280283381760 + 12800 = 280283394560 280283394560 + 51 = 280283394611 $$
0x4142313233 =
0x41 * 256^4 + 0x42 * 256^3 + 0x31 * 256^2 + 0x32 * 256^1 + 0x33
= 65 * 4294967296 + 66 * 16777216 + 49 * 65536 + 50 * 256 + 51
= 279172874240 + 1107296256 + 3211264 + 12800 + 51
= 279172874240 + 1107296256 = 280280170496
280280170496 + 3211264 = 280283381760
280283381760 + 12800 = 280283394560
280283394560 + 51 = 280283394611
1) 280283394611 ÷ 36 = 7785649850 余 11 → 'B'
2) 7785649850 ÷ 36 = 216268051 余 14 → 'E'
3) 216268051 ÷ 36 = 6007445 余 31 → 'V'
4) 6007445 ÷ 36 = 166873 余 17 → 'H'
5) 166873 ÷ 36 = 4635 余 13 → 'D'
6) 4635 ÷ 36 = 128 余 27 → 'R'
7) 128 ÷ 36 = 3 余 20 → 'K'
8) 3 ÷ 36 = 0 余 3 → '3'
反向排列余数:3 K R D H V E B
所以 "AB123" 的 Base36 编码结果是 "3KRDHVEB"
Python 脚本如下: