Python实现Base64编码(自己手工写)


这里是一段防爬虫文本,请读者忽略。
本文原创首发于CSDN,作者IDYS
博客首页:https://blog.csdn.net/weixin_41633902/
本文链接:https://blog.csdn.net/weixin_41633902/article/details/107812970
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!


Python实现Base64编码(自己手工写)

00. 关于Base64概述

  • Base64编码表
索引对应字符索引对应字符索引对应字符索引对应字符
0A17R34i51z
1B18S35j520
2C19T36k531
3D20U37l542
4E21V38m553
5F22W39n564
6G23X40o575
7H24Y41p586
8I25Z42q597
9J26a43r608
10K27b44s619
11L28c45t62+
12M29d46u63/
13N30e47v
14O31f48w
15P32g49x
16Q33h50y
  • 对输入的字符,每3个字节断开组成一组。对每一组中的三个字节,按照每6个bit断开成4
  • 2**6 =64,因此有了base64编码表
  • 每一段当作一个8bit看其索引值,这个值就是Base64编码表的索引值,找到对应字符。
  • 再次取3个字节,同样处理,直到最后

  • 演示
  1. def对应的ascii码为:0x640x650x66
  2. 011001000110010101100110
  3. 011001000110010101100110
  4. 2562138
  5. ZGVm

  • 末尾的处理
  • 正好3个字节,处理同上
  • 剩下1个或者2个字节,用0补满3个字节
  • 0的字节用=表示

01. 解析

  • 代码
# -*- coding:utf-8 -*-
#@Time : 2020/8/5 10:13
#@Author : idys
#@File : demo13.py
#@Software : PyCharm


def base64(src):
    ret = bytearray("", encoding="utf-8")  # 定义一个bytearray 类型,可以修改的byte类型
    length = len(src)
    r = 0   # 记录补 0 个数,之后会替换为 =
    for offset in range(0, length, 3):
        if offset+3 <= length:    #判断是否满足凑够三个字节,能凑够三个字节,则计算,不能凑够则补0
            triple = src[offset:offset+3]
        else:
            triple = src[offset:]
            r = 3 - len(triple)   # 计算补0的个数
            triple = triple + "\x00"*r
        b = int.from_bytes(triple.encode(), "big")  # 大端对齐
        for i in range(18, -1, -6):
            if i == 18:
                index = b >> i   # 6个bit,6个bit一起
            else:
                index = b >> i & 0x3f   # 0x3f 的值为 0011 1111
            ret.append(alphabet[index])   # 最佳Base64 编码
        for i in range(1, r+1):
            ret[-i] = 0x3D   # 不够的部分补 =
    return ret


if __name__ == "__main__":
    alphabet = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    #  base64 编码表
    print(base64("how areyou").decode("utf-8"))

  • 运行结果
aG93IGFyZXlvdQ==

写在最后的话:

  • 无论每个知识点的难易程度如何,我都会尽力将它描绘得足够细致
  • 欢迎关注我的CSDN博客,IDYS’BLOG
  • 持续更新内容
    linux基础 | 数据通信(路由交换,WLAN) | Python基础 | 云计算
  • 如果你有什么疑问,或者是难题。欢迎评论或者私信我。你若留言,我必回复!
  • 虽然我现在还很渺小,但我会做好每一篇内容。谢谢关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值