python练习-----------base64编码&解码


from collections import OrderedDict
import base64


#将base64位编码写入字典key是str,value是int
str1 = {str(chr(65 + i)): j for i in range(26) for j in range(0, 26) if i == j}
str2 = {str(chr(97 + i)): j for i in range(26) for j in range(26, 52) if i == j - 26}
str3 = {str(i): j for i in range(10) for j in range(52, 62) if i == j - 52}

str1.update(str2)
str1.update(str3)
str1.update({'+': 62, '/': 63})
str4 = [i for i in str1]


base64解码

target = ''
def fn1(basestr, target=str()):
    # basestr = input("please input >>>")      
    basestr1 = bytearray()                    # 创建一个空的bytearray,之后用来保存转换完成的bytes
    basestr = basestr.encode()                # 将输入的字符串编码,转换成bytes
    lengh = len(basestr)                      # 将输入的字符串算出长度,之后用于遍历,
    flag = True                               # 做一个标记,看之后的if语句是否进入 

    for i in range(0, lengh, 3):              # 每次取三个字符 3 * 8 = 24 转换成 24 = 4 * 6
        extract = basestr[i:i + 3]            # 将3个字符去出
        if len(extract) < 3:                  # if 判断是否够三个,不够补0
            r = 3 - len(extract)
            extract = extract + b'\x00' * r
            flag = False
        basestr2 = int.from_bytes(extract, 'big')       # 转换成int为之后的 >> 移位
        for j in range(18, -1, -6):                     # 每次取6位
            cx = (basestr2 >> j) & 0x3f                 # 将每6位& 0b111111,转成bytes
            basestr1.append(cx)                         # 添加进bytearray
    for x in basestr1:
        target += str4[x]                               # 对照base64位编码,取出int 
    if not flag:                                        # 确定前面是否有补0
        target = target[:-r] + '=' * r

    return target.encode()


base64编码


def bad(basestr,target=str()):
    # basestr = basestr.decode()
    length = len(basestr)
    binstr = bytearray()
    basestr = basestr.decode('utf-8')
    for j in range(0,length,4):
        basestr11 = basestr[j:j+4]
        # binstr2 = bytearray()
        binstr2 = 0
        # print(basestr11)
        for x,i in enumerate(range(18,-1,-6)):
            basestr12 = basestr11[x]
            if basestr12 == '=':
                continue
            binstr2 = binstr2 | (str1[basestr12]) << i
            # print(bin(binstr2))
        # print(binstr2)
        # print(len(bin(binstr2)))
        binstr2 = binstr2.to_bytes(3,'big')
        # for m,n in enumerate(range(16,-1,-8)):
        #     binstr2 >> n
        # print(binstr2)
        target += binstr2.decode('utf-8')
    # basestr = int.from_bytes(basestr,'big')
    return target

for i in [b'YQ==',b'YWI=',b'YWJj',b'5Lit5Zu9',b'YWJjZA==']:

    print(bad(i))


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值