一步到位 Base64 编码
相关文章:
Base64 之 JavaScript 实现
在Web前端还可以这样实现Base64
什么是Base64
下面一段引用百度百科的介绍,不知道你看后会有什么感想,反正当初我刚接触Base64时是没看明白它在说什么。
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
下面这段是给出我的理解,当然要看懂下面这段,你需要掌握一些非常基础的计算机技术常识,如:一个字节是8bits(8位)等。
Base64编码要求把3个8位字节(3x8=24)转化为4个6位的字节(4x6=24),因为在计算机中,一个字节是8bits所以需要在编码后的6位的前面补两个0,形成8位一个字节的形式。 在对一个串(可能是字符串,也可以是二进制串)进行Base64编码的过程中,如果最后剩下的串不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。
为了保证所输出的编码是可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。
我曾把Base64编码理解成64进制(把陌生概念映射到熟悉的领域帮助理解),但Base64编码与64进制不完全一样。
编码规则
- 把3个字符变成4个字符。
- 每76个字符加一个换行符。
- 最后的结束符也要处理。
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3x8 = 4x6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
Base64编码表
码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
编码过程
这里仅举一个ASCII码编码过程的例子。针对UTF-8或图片等的编码过程与之类似,只是把对应的 转成ascii 和 转换成2进制 这两步替换成其他对应的步骤,只要能得到一个2进制串就行了。
首先把原理的公式列一下: 3x8=4x6
内存1个字符占8位
转前: a 4 9
先转成ascii:对应 97 52 57(只有ascii字符才会这样操作)
转成2进制: 01100001 00110100 00111001
6个一组(4组) {011000}{010011}{010000}{111001}
然后才有后面的 011000 010011 010000 111001
然后计算机是8位8位的存数 6不够,自动就补两个高位0了
所以有了 高位补0得到:00011000 00010011 00010000 00111001
转成十进制得到: 24 19 16 57
查表得到 Y T Q 5
Base64 编码的扩展
Base64 在 URL 中的扩展
标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
Base64在正则表达式中的扩展
用于正则表达式的改进Base64,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”在正则表达式中都具有特殊含义。