-
base64 编码的本质:将 8bit 二进制数转化为 6bit 的可打印字符。
Base64编码用于需要将二进制数据转为文本数据进行储存和传输的场景。 -
Javascript内部的字符串,都以utf-16的形式进行保存,因此编码的时候,我们首先必须将utf-8的值转成utf-16再编码;
解码的时候,则是解码后还需要将utf-16的值转回成utf-8。 -
问:为什么在进行http传输的时候,需要将Byte数组进行base64编码呢?
答:因为http协议是文本协议,不同于二进制协议(如Thrift)那样直接进行二进制传输。 -
base64是一种编码算法。为什么叫base64呢?因为这种算法只支持可打印字符中的64个(26个大写字母、26个小写字母、0-9这9个数字、+、/)(再加上作为垫字的"=",实际上是65个字符)。
-
问:什么是可打印字符?
答:ASCII码的范围是0-127,其中0-31和127这33个字符属于控制字符(Control characters)。
剩下32-126这95个字符属于可打印字符(Printable characters),包括数字、大小写字母、常用符号。 -
早期的一些传输协议,例如传输邮件的SMTP协议,只能传输可打印的ascii字符。导致原本8bit字节码范围(范围0-255)超过了可用的范围。
比如当邮件传输图片资源的时候,某一个Byte值是10111011B,对应十进制187不属于ASCII码范围,因此无法被传输。
这个时候,base64编码应运而生了,它利用6bit字符表达了原本的8bit字符。 -
问:原本的字节码是8bit,base64怎么能够用 6bit 来容纳 8bit 的内容呢?
答:既然单一字符的位数有限,我们可以增加字符的数量。8和6的最小公倍数是24,这就意味着我们可以用4个base64字符来表示3个传统的8bit字符。
相比8bit的字符编码,base64编码会多占用三分之一的字节长度,以此为代价实现了更好的兼容性。