Base64编码核心思想:
每3个字节断开,拿出一个3个字节,每6个bit断开成4段。
因为每个字节其实只占用了6位, 2**6 = 64 ,因此有了base64的编码表。
每一段当做一个8bit看它的值,这个值就是Base64编码表的索引值,找到对应字符。 再取3个字节,同样处理,直到最后。
举例:
abc对应的ASCII码为:0x61 0x62 0x63
01100001 01100010 01100011 # abc
011000 010110 001001 100011
00011000 00010110 00001001 00100011 # 每6位补齐为8位
24 22 9 35
alphabet = b"ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
def base64encode(src) -> bytes:
ret = bytearray()
# 判断类型模块
if isinstance(src,str):
_src = src.encode()
elif isinstance(src,bytes):
_src = src
else:
raise TypeError
# 切片赋值
length = len(_src)
for start in range(0,length,3):
triple = _src[start:start+3]
# 最后是否有空余,然后用合适数量的‘=’补齐
r = 3 - len(triple)
if r:
triple += b'\x00' * r
b = int.format_bytes(triple,'big') # 将一个字节序转换为整数
for i in range(18, -1, -6):
index = b >> i if i == 18 else b >> i & 0x3F
ret.append(alphabet[index]2)
if r:
ret[-r:] = b'=' * r
return bytes