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之类更大的编码方式的字符串了

 

posted @ 2023-06-01 12:06  WmW  阅读(11)  评论(0编辑  收藏  举报