Base64学习理解
Base64 是用64个可打印的字符来描述数据的编码方式
为什么要整这个Base64呢,那是因为有的时候我们需要以可打印字符串的形式传递数据,比如url传递,
假设有个具有4字节的数据 [97, 32, 245, 0],我们要把它转成可打印的字符串,首先不能直接把它转成ASCII字符串,因为有不可打印的字符,且会出现乱码,
我们可以转成json字符串 [97, 32, 245, 0],也可以转成十六进制字符串 6120F500,但是这样感觉太冗余了,url传递希望字符越少越好,有没有更好的办法呢
这个时候就能用到Base64了,它有64个可打印字符,它能描述最多2的6次方个数值,描述3个字节的数据只需要用到3*8/6=4个字符
Base64编码的核心逻辑就是把原来的字节数组每3个字节中的24位分成4份,每份6位用其字符集中的字符来描述
比如 [97, 32, 245, 0],它的二进制位是这样的
01100001 00100000 11110101 00000000
Base64是按3个字节为一组处理的,所以咱们先看前3个字节
01100001 00100000 11110101
把这3个字节分成4份,每份6位
011000 010010 000011 110101
每份按照一个字节看成具体的数值,根据数值对应Base64字符(因为只有6位,所以要前头补两个0位凑够8位一个字节,本质上还是在2的6次方范围内)
下面的格式:二进制位(Base64值,Base64字符)
00011000(24,Y) 00010010(18,S) 00000011(3,D) 00110101(53,1)
把字符拼起来得到 YSD1(区分大小写)
然后再看最后一个字节 00000000 ,因为一个字节8位,不是6的倍数,没法处理,因此要凑够3字节共24位,需要补2个字节
最后一个字节再补2个空字节
00000000 00000000 00000000
将其分成4份
000000 000000 000000 000000
补0然后查表
00000000(0,A) 00000000(0,A) 00000000(=) 00000000(=)
因为补了2个字节,且要和值为0(符号A)的非补字节区分开来,特规定通过补充产生的字节用=代替,补几个字节加几个=
拼接得到字符串AA==
最终得到Base64字符串YSD1AA==,一共8个字符,比json的少,和十六进制的一样(这是举例最糟糕的情况,原本只有4个字节,因为补了2个字节,相当于描述了6个字节,理想情况下如果字节数正好是3的倍数,则比十六进制每3个字节要少2个字符)
上面讲的是纯字节数组转Base64字符串进行数据传输的情况
有的时候我们是要把字符串进行Base64编码,这样就需要先把字符串转成字节数组,然后在转成base64字符串,这样的编码出来的字符串要比原字符串大,就拿ASCII字符串来说,一个字符一个字节,3个字节3个字符,但是Base64编码后3个字节却要4个字符,再加上有可能的补字节机制,导致对字符串Base64编码后得到的base64字符串要比原字符串大,更不用说UTF8和GBK之类更大的编码方式的字符串了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示