用途
一般用于将二进制数据编码成字符串方便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 | / | 
