Base64 编码核心思想 :
- 每3个字节断开, 拿出一个3字节, 每6个断开, 成4段
- 因为每个字节其实只占了6位, 2**6 = 64, 因此有了base64的编码表
- 每一位当做一个8位看它的值, 这个值就是Base64编码表的索引值(0 ~ 63), 找到对应的字符
下面我们来考虑以下情况:
- 一个字节能变成几个Base64 的字节 ?
- 两个字节能变成几个Base64 的字节 ?
- 字符串 ‘`’ 反引号如何处理 ?
根据上图编码方式不难总结 : ASCII 码一字节可以变成Base64编码2字节, 两字节变成3 字节, 反引号是1字节, 8位被断开, 前6位一组, 余下后2 位
末尾的处理 :
- 正好是3自己处理方式同上
- 剩下1 字节或者 2个字节, 用0 补满3 个字节
- 全部补0 的字节用 “=” 表示
- 但是这里注意一下, 补零的特殊情况, 例如只有一字节(ASCII码), 需要用0 再补两字节, 这样可以正好转换成Base64编码4 字节, 末尾两字节是后补的0 可以正常用 “=” 补齐(上图中n3, n4 位置), 但是注意n2 位置如果有b1 位置余下的 "0"和后来补齐的零是不同的0, 就不能直接用 "="表示了, 需对应Base64 编码表里的0 索引表示, 也就是 A
代码设计
alphabet = b'ABCDEFGHIJKLMNOPORSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
def base64code(src:str):
ret = bytearray()
if isinstance(src, str):
_src = src.encode()
else:
return
lenth = len(_src) # bytes
offset = 0
for offset in range(0, lenth, 3): # 三位一组
triple = _src[offset:offset+3]
r = 3 - len(triple)
if r: # 不足三位补0
triple += b'\x00'*r
x