Loading... ```python 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 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏