编码系列-Base64编码

2021-03-11  本文已影响0人  mtry

写在前面

Base64算法最早应用于解决电子邮件传输问题,在早期,电子邮件只支持ASCII码字符。如果要传输一封带有非ASCII码字符的电子邮件,当它经过部分网关时就可能出现问题,这个网关可能会对非ASCII码字符的二进制位进行调整,即将这个非ASCII码的8位二进制码最高位置设置为0,此时用户收到的这个邮件就会是一封乱码的了。基于这个原因产生了Base64算法。

Base64是一种基于64个可打印字符(A-Z、a-z、0-9、+、/)来表示二进制数据的表示方法,常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。

原理

第一步,将每三个字节作为一组,一共是24个二进制位。

第二步,将这24个二进制位分为四组,每个组有6个二进制位。

第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节。

第四步,这样每个字节的转换为十进制的值范围为:0-63,根据编码表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。

0  A   17 R   34 i   51 z
1  B   18 S   35 j   52 0
2  C   19 T   36 k   53 1
3  D   20 U   37 l   54 2
4  E   21 V   38 m   55 3
5  F   22 W   39 n   56 4
6  G   23 X   40 o   57 5
7  H   24 Y   41 p   58 6
8  I   25 Z   42 q   59 7
9  J   26 a   43 r   60 8
10 K   27 b   44 s   61 9
11 L   28 c   45 t   62 +
12 M   29 d   46 u   63 /
13 N   30 e   47 v
14 O   31 f   48 w   
15 P   32 g   49 x
16 Q   33 h   50 y

比如:编码 Man

base64_img01.png

这里有一个问题,字节数是否能被3整除。

如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。也就是说,当最后剩余两个八位(待补足)字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;如果最后剩余一个八位(待补足)字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。

base64_img02.png

注意:Base64是把3个字节编码成4个字节,所以编码编码之后的长度差不多增加了133%

关于URL安全Base64编码

Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java持久化系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的/和+字符变为形如%XX的形式,而这些%号在存入数据库时还需要再进行转换,因为ANSI SQL中已将%号用作通配符。

为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充=号,并将标准Base64中的+和/分别改成了-和_,这样就免去了在URL编解码和数据库存储时所要做的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

参考资料

上一篇下一篇

猜你喜欢

热点阅读