用途
一般用于将二进制数据编码成字符串方便URL传输,也解决了非ASCII字符,比如中文字符,的传输问题。
Base64 也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。
垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。
转码示例 "hey" => "aGV5"
步骤 | 结果 |
---|---|
ascii | 104 101 121 |
2进制 | 01101000 01100101 01111001 |
6位分组 | 011010 000110 010101 111001 |
高位补零 | 00011010 00000110 00010101 00111001 |
10进制 | 26 6 21 57 |
查对照表 | a G V 5 |
转换结果的长度必然是4的倍数,不足的部分补=号,一个字节的转成两个字节补两个=号,两个字节的转成三个字节补一个=号
如: "1" => "MQ==", "12" => "MTI="
经过Base64编码后的数据会比原始数据长,至少为原来的4/3倍。
RFC2045还规定,在电子邮件中,每行为76个字符,每行末需添加一个回车换行符("\r\n")。
变种
标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,
而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,
这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及“[”和“]”在正则表达式中都具有特殊含义。
此外还有一些变种,它们将“+/”改为“-”或“.”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。
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 | / |