【python手动实现】汉字转base64编码(附源码)

写在前面

找了半天都没找到直接把汉字转换成base64编码的代码,没办法自己研究着写一个吧,如果对base64原理不是很了解,可以自行搜索,网上的文章还是比较多的。

汉字转base64步骤

1.将汉字转换成utf-8二进制编码
2.将每个字节串转换成二进制串并拼接到一起
3.每三个字节(24bit)为一组,每组划分为四个六位,每个六位组转化成十进制(不够三个字节的填充0至三个字节,最后填充的000000将被转化成=,所以此处代码分情况讨论,将要填充的000000未做填充直接拼接上=)
4.根据十进制数对应查找base64编码表,查找到对应的字符拼接在一起

base64转换表

【python手动实现】汉字转base64编码(附源码)_第1张图片

代码实例

#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

测试结果
【python手动实现】汉字转base64编码(附源码)_第2张图片

参考链接

在线编码网站,测试自己代码是否正确: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

写在最后

本代码按照自己的理解纯手写,未经过大量用例测试,水平有限,若有错误,欢迎各位批评指正!
如果对你有帮助,点个赞再走呀,谢谢!

你可能感兴趣的:(python,python)