美文网首页
编码系列-Base64编码

编码系列-Base64编码

作者: mtry | 来源:发表于2021-03-11 19:37 被阅读0次

    写在前面

    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编解码和数据库存储时所要做的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

    参考资料

    相关文章

      网友评论

          本文标题:编码系列-Base64编码

          本文链接:https://www.haomeiwen.com/subject/hxuoqltx.html