Python 手动实现 Base64 编码

前段时间看了某篇文章,讲解在 Python 中编码 Base64 的程序。然而那片文章完全只是调用 base64 这个包。Python 调包是相当方便,但是这样除了调包还是调包,根本达不到锻炼编码能力的效果。用人单位招人面试可不看你怎么调包,很多都是自己要手撕实现的。现在的 IT 开发岗位就是这么卷。

这里研究一下在 Python 怎么手动实现 Base 编码。

要求:使用 Python 语言实现一个函数 base64(src) ,参数是一个字符串,返回的也是一个字符串,是参数中的字符串经过 Base64 编码得到的编码后的字符串。禁止使用 import 。

  1. Base64 是一种编码方式(不是加密方式),将二进制编码为 64 字符串组成的字符码,因此需要先将 ASCII 码(表示 0 - 127 数值范围)先转为二进制数字,再对二进制编码
  2. Base64 表示了从 0 ~ 63 数值,有 64 个字符(2 的 6 次方是 64,所以是 64 个字符),由 A - Z,a - z,0 - 9,+, / 这 64 个字符组成的(还有一个表示后缀的字符=)
  3. Base64 把每三个 8 Bit 的字节转换为四个 6 Bit 的字节(8 和 6 的最小公倍数是 24),也就是说,转换后的字符串理论上将要比原来的长 1 / 3,转换前的 ASCII 码字符长度如果不是 3 的倍数,需要将转换二进制数字末尾补 0

示例:


4. 解码的过程:去掉 Base64 字符末尾的=。剩下的 Base64 字符,转为二进制数字,每 8 个 bit 组成一个字节,最后剩余不足 8 位的丢弃即可
5. Base64 字符对应表

索引对应字符索引对应字符索引对应字符索引对应字符索引对应字符索引对应字符
0A10K20U30e40o50y
1B11L21V31f41p51z
2C12M22W32g42q520
3D13N23X33h43r531
4E14O24Y34i44s542
5F15P25Z35j45t553
6G16Q26a36k46u564
7H17R27b37l47v575
8I18S28c38m48w586
9J19T29d39n49x597
60861962+63/

程序:

def base64(src):
    alphabet = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    ret = bytearray()
    length = len(src)
    # r记录补0的个数
    r = 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 + '\x00' * r
        
        b = int.from_bytes(triple.encode(), 'big')
 
        for i in range(18, -1, -6):
            if i == 18:
                index = b >> i
            else:
                index = b >> i & 0x3F
            ret.append(alphabet[index])
 
        for i in range(1, r + 1):
            ret[-i] = 0x3D
    return ret.decode('utf-8')

测试:

print(base64('abcde')) # 输出:YWJjZGU=
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值