跳转至

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 脚本如下:

import base36

text = "AB123"

encoded = base36.dumps(int.from_bytes(text.encode('utf-8'), 'big'))
print(encoded)


decoded_int = base36.loads(encoded)
decoded_bytes = decoded_int.to_bytes((decoded_int.bit_length() + 7) // 8, 'big')
print(decoded_bytes.decode('utf-8'))