Python实现Base64编码

Base64编码简介

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于 26 = 64,所以每6位为一个单元,对应某个可打印字符。3个字节一共24位,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。

在Base64中的可打印字符包括字母 A-Za-z、数字 0-9,这样共有62个字符,此外,还有两个可打印字符,根据使用场景不同而使用不同的值,标准的Base64使用字符 +/,URL安全和文件系统安全的Base64使用字符 -_

Python实现

Python标准库中的 base64 模块提供了Base64编码和解码的方法,使用起来也很方便。但是为了从原理上来理解Base64编码,所以自己用Python实现了标准Base64编码和URL安全的Base64编码的方法。

import re
from functools import reduce
from base64 import b64encode

# 构建base 64 字符映射表
b64_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
b64_mapping = {k: v for k, v in zip(range(64), b64_alphabet)}

# 标准Base64编码
def b64_encode(bytes_string):
    # 判断参数类型
    if not isinstance(bytes_string, (bytes, bytearray)):
        raise TypeError('Expected "bytes" or "bytearray" object')

    # 计算字节字符串长度
    bytes_len = len(bytes_string)
    # 计算要补充的 "=" 的长度
    pad_len = 3 - bytes_len % 3 if bytes_len % 3 else 0
    # 规范化字节字符串,使其长度是3的整数倍
    normalized_bytes_string = bytes_string + b'\x00' * pad_len
    # 按照每3个字节一组将规范化的字节字符串进行分组
    bytes_string_list = re.findall(b'.{3}', normalized_bytes_string)
    # 将每组中的3个字节中的每个字节用8位二进制表示,结果为由表示24位二进制数的字符串组成的数组
    bin_string_list = [
        reduce(lambda x, y: x + y,
               map(lambda h: '0' * (8 - len(bin(h).lstrip('0b'))) + bin(h).lstrip('0b'),
                   item))
        for item in bytes_string_list
    ]
    # 将表示24位二进制的字符串平均分割成四段,每段表示一个6位二进制数
    b64_bin_string_list = [re.findall('.{6}', ele) for ele in bin_string_list]
    # 将嵌套数组扁平化处理,生成base64字符键列表
    b64_key = []
    for i in b64_bin_string_list:
        for j in i:
            b64_key.append(int(j, base=2))
    # 根据base64字符映射表构造最终的base64编码字符串
    b64_string = ''
    for k in b64_key:
        b64_string += b64_mapping[k]
    b64_string = b64_string[:(len(b64_string) - pad_len)] + '=' * pad_len
    b64_bytes_string = b64_string.encode('ascii')
    return b64_bytes_string

# URL安全的Base64编码
def b64_urlsafe_encode(bytes_string):
    return b64_encode(bytes_string).replace(b'+', b'-').replace(rb'/', b'_')

你可能感兴趣的:(python,base64)