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'))
    # 三处右边的空字符
Last modification:July 28th, 2020 at 05:24 pm
If you think my article is useful to you, please feel free to appreciate