Base64 编码解码Python实现

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

编码的过程:

bytes -> int --移位--> bytearray收集 -> bytes

  1. 将源数据三个字节三个字节分开,分别处理
  2. 3个字节是24Bit,平均分成4份,每一份6Bit,每一份前面补两位0,形成新的4个字节。不够4个,用零补齐,最后将无效的字节替换成b'='号
  3. 每一个新字节,对照Base64编码表,组成新的数据

bytes 和 int 之间的转换:

           bytes.fromhex('%x' % num):       Create a bytes object from a string of hexadecimal numbers.

            num.to_bytes(len,'big'or'little'):  int -> bytes

            int.from_bytes(bytes):                 bytes -> int

解码即即编码的逆过程,下面是代码实现

import base64  #内部库验证


base_chrs = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
chrsdic = dict(zip(base_chrs, range(64)))


def bs64encode(src):
    """将源数据按base64编码

    :param src:bytes
    :return: bytes
    """
    ret = bytearray()
    r = 0
    for i in range(0, len(src), 3):
        block = src[i:i+3]          #切片,超界也无所谓
        if len(block) < 3:
            r = 3 - len(block)
            block += b'\x00' * r    #用\x00补齐位数
        num = int.from_bytes(block, 'big')
        for j in range(4):
            k = (4-j-1)*6
            c = (num >> k) & 0x3f
            ret.append(base_chrs[c])
    for i in range(1, r+1):
        ret[-i] = int.from_bytes(b'=', 'big')
    return bytes(ret)


def bs64decode(src):
    """解码base64编码数据
    
    :param src: bytes
    :return: bytes
    """
    ret = bytearray()
    for i in range(0, len(src), 4):
        block = src[i:i+4]
        tmp = 0x00
        cnt = 0
        for j in range(4):
            index = chrsdic.get(block[-j-1])   #get找不到返回None,用负索引,j就是要移动的位数
            if index is not None:
                tmp += index << j*6
            else:                             #None就是遇到最后的b'=',为0,所以不用移位
                cnt += 1
        num = tmp.to_bytes(3, 'big')          # int.to_bytes()
        ret.extend(num)                       #bytearray 为list,方法通用
    for k in range(cnt):
        ret.pop()
    return bytes(ret)



猜你喜欢

转载自blog.csdn.net/qq_33287645/article/details/80085443