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))