• 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)
    为什么要坚持,想一想当初!
  • 相关阅读:
    搞懂树状数组
    C#接口(Interface)
    C#接口(Interface)
    C#运算符的重载
    C#和C++的区别(一)
    hdu1874 畅通工程续
    hdu1874 畅通工程续
    C#多态性
    C#多态性
    C#继承
  • 原文地址:https://www.cnblogs.com/JerryZao/p/9574891.html
Copyright © 2020-2023  润新知