alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
dict_alphabet = dict(zip(alphabet, range(64)))
# 生成字典
def base64_encode(src: bytes) -> bytes:
"""
base64编码
param src: 需要编码的内容 bytes类型
return: 编码结果
"""
ret = bytearray()
length = len(src)
# ret 为结果
r = 0
# 不足三个字符时,需要补多少个 0 这个0是ASCII码中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 + b'\x00' * r
b = int.from_bytes(triple, 'big')
# 将字符转换为大端模式
for i in range(18, -1, -6):
if i == 18:
index = b >> i
else:
index = b >> i & 0x3F
# 0x3F = 63 = 0011 11111
# 进行位运算后只剩下最后6位了
# 例如: 011000 010110 & 000000 111111 = 010110
ret.append(alphabet[index])
# 这里取出来的是ASCII码中的值,所以是使用append
for i in range(1, r + 1):
ret[-i] = 0x3D
# 逆序添加 '='
return ret
def base64_decode(src: bytes) -> bytes:
ret = bytearray()
# 结果,bytearray 可以修改, bytes是只读的
step = 4
for offset in range(0, len(src), step):
block = src[offset:offset + step]
# 四个字符一组
# 密文和明文标准对应关系 4个密文字符对应3个明文字符
tmp = 0x00
# 临时变量,用于保存最后二进制数据
for i in range(4):
index = dict_alphabet.get(block[-i - 1])
# 倒序取出
if index is not None:
tmp += index << (i * 6)
# 位运算
ret.extend(tmp.to_bytes(3, 'big'))
# 最佳到结果,整数转为字符,大端模式,3个字符
return bytes(ret.rstrip(b'\x00'))
# 三处右边的空字符
最后修改:2020 年 07 月 28 日
© 允许规范转载