0%

Python 手动实现 Base64 编码

前段时间看了某篇报纸文章,讲解在 Python 中编码 Base64 的程序。然而那片文章完全只是调用 base64 这个包。Python 调包是相当方便,但是这样除了调包还是调包,根本达不到锻炼编码能力的效果。用人单位招人面试可不看你怎么调包,很多都是自己要手撕实现的。现在的 IT 开发岗位就是这么卷。

这里研究一下在 Python 怎么手动实现 Base 编码。

要求:使用 Python 语言实现一个函数 base64(src) ,参数是一个字符串,返回的也是一个字符串,是参数中的字符串经过 Base64 编码得到的编码后的字符串。禁止使用 import

  1. Base64 是一种编码方式(不是加密方式),将二进制编码为 64 字符串组成的字符码,因此需要先将 ASCII 码(表示 0 - 127 数值范围)先转为二进制数字,再对二进制编码
  2. Base64 表示了从 0 ~ 63 数值,有 64 个字符(2 的 6 次方是 64,所以是 64 个字符),由 A - Z,a - z,0 - 9,+, / 这 64 个字符组成的(还有一个表示后缀的字符=
  3. Base64 把每三个 8 Bit 的字节转换为四个 6 Bit 的字节(8 和 6 的最小公倍数是 24),也就是说,转换后的字符串理论上将要比原来的长 1 / 3,转换前的 ASCII 码字符长度如果不是 3 的倍数,需要将转换二进制数字末尾补 0
    示例:
  4. 解码的过程:去掉 Base64 字符末尾的=。剩下的 Base64 字符,转为二进制数字,每 8 个 bit 组成一个字节,最后剩余不足 8 位的丢弃即可
  5. Base64 字符对应表
索引对应字符索引对应字符索引对应字符索引对应字符索引对应字符索引对应字符
0A10K20U30e40o50y
1B11L21V31f41p51z
2C12M22W32g42q520
3D13N23X33h43r531
4E14O24Y34i44s542
5F15P25Z35j45t553
6G16Q26a36k46u564
7H17R27b37l47v575
8I18S28c38m48w586
9J19T29d39n49x597
60861962+63/

程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def base64(src):
alphabet = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
ret = bytearray()
length = len(src)
# r记录补0的个数
r = 0
for offset in range(0, length,3):
if offset + 3 <= length:
triple = src[offset:offset + 3]
else:
triple = src[offset:]
r = 3 - len(triple)
triple = triple + '\x00' * r

b = int.from_bytes(triple.encode(), 'big')

for i in range(18, -1, -6):
if i == 18:
index = b >> i
else:
index = b >> i & 0x3F
ret.append(alphabet[index])

for i in range(1, r + 1):
ret[-i] = 0x3D
return ret.decode('utf-8')

测试:

1
print(base64('abcde')) # 输出:YWJjZGU=
Buy me a coffee
No.5972 Alipay

Alipay

推进创文常态化 共建文明襄阳城 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 做文明襄阳人 建文明襄阳城 凝聚文明正能量 筑梦千年古襄阳 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 创建全国文明城市 加快建设汉江流域中心城市 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 讲文明 树新风 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 用微笑融化陌生 用文明美化襄阳 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 争当文明使者 播撒文明新风