Base64编码,解码的实现

关键点:

  1、3*8 = 4*6,不够补零

  2、base64 是用索引来查询,不同于ascii

   具体文件可以百度,也可以私聊我

  编码:

 1 alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
 2 import base64
 3 
 4 def base64encode(str1:str):# 这里固定让传字符串,当然也可以传bytes类型,需要判断一下
 5     target = bytearray()# 放最后转化出来的结果
 6     if isinstance(str1,str):
 7         _str1 = str1.encode()
 8     else:
 9         return
10     length = len(_str1)
11     r = 0#
12     for step in range(0,length,3): # 步长为3,三个字节,3*8 24 位= 4* 6
13         tiple = _str1[step:step+3]
14        # 用来测试最后一段是否3个字节 如果最后一步加3 大于length,证明step小于3
15         if step + 3 > length:
16             r = 3 - len(tiple)
17             tiple += b'x00' * r #  补0 这里是ascii的0,补为3个字节
18         # 通过位与,移位来算出每6 位二进制对应的10进制,也就是base64表中的index
19         # 只有int才能位移
20         val = int.from_bytes(tiple, 'big')
21         # print(val)
22         for i in range(18, -1, -6):# 每三个字节,24 位,每次移动6位
23             index = val >> i & 0x3F #求每6位对应的十进制,所以移走的不管了,没有移走的,高位 置零,这里利用位与
24             target.append(alphabet[index])
25     if r: # 替换等号
26         target[-r:] = b'=' * r
27     return bytes(target)
28 
29 lst = ['a','abc','ab','啊a测试']
30 lst = ['啊a测试']
31 for i in lst:
32     print(i)
33     print(base64encode(i))
34     print(base64.b64encode(i.encode()))
35     print('-'*30)
为什么要坚持,想一想当初!
原文地址:https://www.cnblogs.com/JerryZao/p/9574891.html