编码系列-Base64编码

写在前面

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

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • https://blog.csdn.net/lili13897741554/article/details/821...
    临风2020阅读 2,145评论 1 0
  • Base64编码由来 Base64最早是用来解决电子邮件的传输问题。 传统的电子邮件是1982年定下技术规范的,详...
    Ashton阅读 2,613评论 0 6
  •   在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博...
    Hmilylpp阅读 387评论 0 0
  • Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。在做支付系统时,系统之...
    飞狗未来阅读 411评论 0 0
  • 何为Base64,就是说选出64个字符----小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加...
    Simple_Learn阅读 971评论 0 0