找了半天都没找到直接把汉字转换成base64编码的代码,没办法自己研究着写一个吧,如果对base64原理不是很了解,可以自行搜索,网上的文章还是比较多的。
1.将汉字转换成utf-8二进制编码
2.将每个字节串转换成二进制串并拼接到一起
3.每三个字节(24bit)为一组,每组划分为四个六位,每个六位组转化成十进制(不够三个字节的填充0至三个字节,最后填充的000000将被转化成=,所以此处代码分情况讨论,将要填充的000000未做填充直接拼接上=)
4.根据十进制数对应查找base64编码表,查找到对应的字符拼接在一起
#2023.3.28
class Char_To_Base64:
def encode(strlist):
#转换成字节串
num = strlist.encode('utf-8') # 三个字节
# print("字节序列为:"+list(num))
#将numlist中的每个十进制转换成二进制并拼接成一个二进制串
num2_str=Char_To_Base64.Unicode16_To_Twostr(num)
#划分六个为一组
base64code=Char_To_Base64.devide_TowStr(num2_str)
print("转换后的编码为"+base64code)
return base64code
#将十进制数字转换为二进制(不够前面添零)
def Num_To_Two(num):
s=''
chu=-1
yu=0
count=0
while (chu!=0):
chu=int(num/2)
yu=num%2
s='{}'.format(yu)+s
num=int(num/2)
count=count+1
#每个字节不够8位补0
if(count<8):
while count<8:
s='0'+s
count=count+1
return s
#将每个十进制转换成八位二进制并拼接变成二进制串
def Unicode16_To_Twostr(unicode16list):
Unicode2list=''
#将每位十六进制按照ascall码转换成二进制
for i in unicode16list:
Unicode2list=Unicode2list+Char_To_Base64.Num_To_Two(i)
# print(Char_To_Base64.Num_To_Two(i))
print("全部汉字二进制字符串"+Unicode2list)
return Unicode2list
#处理二进制串并切割 返回对应的base64串
def devide_TowStr(strlist):
lens=len(strlist) #获取字符串的长度
base64str=''
print("二进制长度:'",lens)
if lens<24: #如果小于三个字节则进行填充
if lens==8: #如果是一个字节 填充到2*6=12位 剩下的两个六位为000000,直接填充‘=’
for i in range(4):
strlist=strlist+'0'
elif lens==16: #如果是两个字节 填充到3*6=18位 剩下的六位为000000
for i in range(2):
strlist = strlist + '0'
#每24位进行切割
t=0
while t<lens:
base64str=base64str+Char_To_Base64.Devide_SixGroup(strlist[t:t+24])
# print("每24位:"+strlist[t:t+24])
t=t+24
return base64str
#把每个24位划分成四个六位组 返回每个24位的base64串
def Devide_SixGroup(str):
base64str=''
lens=len(str) #判断是否满24位
# print("每个24位共有多长=",lens)
if lens<24: #如果不满足24位 剩下的缺额六位直接转换成’=‘
# print("不满足24位")
t = 0
if lens==12: #补两个=
# print("有12位")
while t<12:
base64str = base64str + Char_To_Base64.Two_To_Ten(str[t:t + 6]) # 将每个六位对应的base64字符拼接
t = t + 6
base64str=base64str+'='
base64str=base64str+'='
t = 0
if lens==18: #补充一个=
# print("有18位")
while t<12:
base64str = base64str + Char_To_Base64.Two_To_Ten(str[t:t + 6]) # 将每个六位对应的base64字符拼接
t = t + 6
base64str = base64str + '='
else:
# print("满足24位")
t=0
#把每个24位分为四个六位组
while t<24:
base64str=base64str+Char_To_Base64.Two_To_Ten(str[t:t+6]) #将每个六位对应的base64字符拼接
# print("每6位"+str[t:t+6])
t=t+6
return base64str
#将每六位转化成十进制并转换成base64码对应的字母
def Two_To_Ten(numstr):
num=0
base64str = ''
for i in range(len(numstr)+1):
if i > 0:
# print(numstr[-i])
num = num + int(numstr[-i]) * pow(2, i - 1)
base64str=base64str+Char_To_Base64.Ten_To_Base64(num)
return base64str
#将十进制位转换成base64码
def Ten_To_Base64(num):
#首先建立base64表 使用字典类型
Base64Dcountry={0:'A',1:'B',2:'C',3:'D',4:'E',5:'F',6:'G',7:'H',
8:'I',9:'J',10:'K',11:'L',12:'M',13:'N',14:'O',
15:'P',16:'Q',17:'R',18:'S',19:'T',20:'U',21:'V',
22:'W',23:'X',24:'Y',25:'Z',26:'a',27:'b',28:'c',
29:'d',30:'e',31:'f',32:'g',33:'h',34:'i',35:'j',
36:'k',37:'l',38:'m',39:'n',40:'o',41:'p',42:'q',
43:'r',44:'s',45:'t',46:'u',47:'v',48:'w',49:'x',
50:'y',51:'z',52:'0',53:'1',54:'2',55:'3',56:'4',
57:'5',58:'6',59:'7',60:'8',61:'9',62:'+',63:'/'}
# print("数字对应编码:",Base64Dcountry[num])
return Base64Dcountry[num]
只需要调用encode()函数传入想转换的汉字或者字符,将会返回编码后的字符串
输入:这是测试
输出:6L+Z5piv5rWL6K+V
在线编码网站,测试自己代码是否正确:https://tool.ip138.com/base64/
字节填充参考:https://www.bbsmax.com/A/kvJ3DxED5g/
base64编码原理参考:https://blog.csdn.net/Enderman_xiaohei/article/details/99632886
python字节串bytes类型理解参考:https://blog.csdn.net/suxiang198/article/details/77585063
本代码按照自己的理解纯手写,未经过大量用例测试,水平有限,若有错误,欢迎各位批评指正!
如果对你有帮助,点个赞再走呀,谢谢!