什么是Base64算法

A:为什么在进行Http传输的时候,需要把Byte数组进行Base64编码呢?

B:这很简单呀,因为Http协议是文本协议,不同于二进制协议(如Thrift)那样直接进行二进制传输。

A:那么,直接把Byte数组转换成String不就行了吗?类似newString(bytes)这样。为什么非要用Base64呢?

B:首先,Base64是一种编码算法。为什么叫左Base64呢?因为这种算法只支持64个【可打印字符】

ValueCharValueCharValueCharValueChar
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

A:为什么只能支持64个字符呢,多了不是更好吗?可打印字符又是什么意思?

B:这就涉及到ASCII码的知识了。ASCII码的范围是0-127,其中0-31和127这33个字符属于控制字符(Controlcharacters)。剩下32-126这95个字符属于可打印字符(Printable characters),包含数字、大小写字母、常用符号。在这里我只列举其中的一部分:

 

B:早起的一些传输协议,例如传输邮件的SMTP协议,只能传输可打印的ASCII字符。导致原本8Bit的字节码(范围0-255)超过了可用的范围。比如当邮件传输图片资源的时候,某一个Byte值是10111011B,对应十进制187不属于ASCII码范围,因此无法被传输。这个时候,Base64编码应用而生了,它利用6bit字符表达了原本的8bit字符。Base64可以把原本ASCII码的控制字符甚至ASCII码之外的字符都转换成可打印的6big字符。

A:可是原本的字节码8bit,Base64怎么能够用6big来容纳8bit的内容呢?

B:既然单一字符的位数有限,我们可以增加字符的数量。8和6的最小公倍数是24,这就意味着我们可以用4个Base64字符来表示3个传统的8bit字符。

B:像表格中这样,8Bit X 3的字符串可以每6个bit分成一组,每一组bit对应一个十进制的index,每一个index值又对应了Base64的字符。最终,8bit的字符串[Man]编码成了Base64的[TWFu]。相比8bit的字符编码,Base64编码会多占用三分之一的字节长度,以此为代价实现了更好的兼容性。

A:那么如果原本的8Bit字符串长度不是3的倍数,比如长度是13,多余的那一个字符怎么编码呢?

B:很好解决,多余的8bit中,前6bit做为一个Base64字符,剩下的2bit做为第二个Base64字符的前两位,后面的四位补0即可。至于第三第四个Base64字符,没有匹配的8bit字符,则使用[=]字符填充(Padding)。如下图把8bit的[M]编码成Base64的[TQ==]。

A:明白啦。那么一个经过Base64编码的字符串,如何进行解码呢?

B:解码也是同样道理,6bit X 4的字符串可以每8bit分成一组,共3组。每一组转换成一个8位的Byte字节。

A:OK,最后一个问题,Base64是否可以用来对重要信息做加密呢?

B:不行的。Base64只是一种编码算法,而非加密算法。任何人都可以将Base64的编码结果解码成唯一的原文。真正的加密算法有很多,包括MD5,SHA,ASE,RSA等等,
--------------------- 
作者:HelloWorld搬运工 
来源:CSDN 
原文:https://blog.csdn.net/wufaliang003/article/details/79573512 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值