关键点:
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)