python本身有base64加密的模塊,不過是用C寫的,封裝成了.so文件,無法查看源碼,本着學習的心態,自己實現了一遍,算法
原理參考 淺談Base64編碼算法.
代碼如下:
# coding:utf8 import string import base64 # 編碼用64位數組 因為是轉換為6個字節的字符 所以64位就夠了 letters = list(string.letters) + list(string.digits) + ['+', '/'] def my_base64_encodestring(input_str): # 對每一個字節取ascii數值或unicode數值,然后轉換為2進制 str_ascii_list = ['{:0>8}'.format(str(bin(ord(i))).replace('0b', '')) for i in input_str] output_str = '' # 不夠3的整數倍 補齊所需要的次數 equal_num = 0 while str_ascii_list: temp_list = str_ascii_list[:3] if len(temp_list) != 3: while len(temp_list) < 3: equal_num += 1 temp_list += ['0'*8] temp_str = ''.join(temp_list) # 三個8字節的二進制 轉換為4個6字節的二進制 temp_str_list = [temp_str[x:x+6] for x in [0, 6, 12, 18]] # 二進制轉為10進制 temp_str_list = [int(x, 2) for x in temp_str_list] # 判斷是否為補齊的字符 做相應的處理 if equal_num: temp_str_list = temp_str_list[0:4-equal_num] output_str += ''.join([letters[x] for x in temp_str_list]) str_ascii_list = str_ascii_list[3:] output_str = output_str + '=' * equal_num #print(output_str) return output_str def my_base64_decodestring(input_str): # 對每一個字節取索引,然后轉換為2進制 str_ascii_list = ['{:0>6}'.format(str(bin(letters.index(i))).replace('0b', '')) for i in input_str if i != '='] output_str = '' equal_num = input_str.count('=') while str_ascii_list: temp_list = str_ascii_list[:4] temp_str = ''.join(temp_list) # 補夠8位 if len(temp_str) % 8 != 0: temp_str = temp_str[0:-1*equal_num*2] # 4個6字節的二進制 轉換 為三個8字節的二進制 temp_str_list = [temp_str[x:x+8] for x in [0, 8, 16]] # 二進制轉為10進制 temp_str_list = [int(x, 2) for x in temp_str_list if x] output_str += ''.join([chr(x) for x in temp_str_list]) str_ascii_list = str_ascii_list[4:] #print(output_str) return output_str if __name__ == "__main__": input_str = '11我' input_str = 'MTHmiJE=' #my_base64_encodestring(input_str) my_base64_decodestring(input_str) pass
如有疏漏之處還請指正