Base64 - from Wikipedia

来源:互联网 发布:自动关机软件 编辑:程序博客网 时间:2024/05/19 23:12

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。

目录

  • 1 MIME
    • 1.1 例子
  • 2 UTF-7
  • 3 IRCu
  • 4 在URL中的应用
  • 5 其他应用
  • 6 外部链接
  • 7 参见

MIME

在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。

完整的base64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的43。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。

转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲器中剩下的bit用0补足。然后,每次取出6(因为26=64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。

当原数据长度不是3的整数倍时, 如果最后剩下一个输入数据,在编码结果后加2个“=”;如果最后剩下两个输入数据,编码结果后加1个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证数据还原的正确性。

例子

举例来说,一段引用自托马斯·霍布斯《利维坦》的文句:

Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.

经过base64编码之后变成:

TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=
  • 编码“Man”
文本ManASCII编码7797110二进制位010011010110000101101110索引1922546Base64编码TWFu

在此例中,Base64算法将三个字符编码为4个字符

Base64索引表:

数值字符 数值字符 数值字符 数值字符0A16Q32g48w1B17R33h49x2C18S34i50y3D19T35j51z4E20U36k5205F21V37l5316G22W38m5427H23X39n5538I24Y40o5649J25Z41p57510K26a42q58611L27b43r59712M28c44s60813N29d45t61914O30e46u62+15P31f47v63/

如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个'='号,代表补足的字节数。也就是说,当最后剩余一个八位字节(一个byte)时,最后一个6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。 参考下表:

文本(1 Byte)A  二进制位01000001                二进制位(补0)010000010000            Base64编码QQ  文本(2 Byte)BC 二进制位0100001001000011  xxxxxx二进制位(补0)010000100100001100xxxxxxBase64编码QkM 

UTF-7

UTF-7是一个修改的Base64(Modified Base64)。主要是将UTF-16的数据,用Base64的方法编码为可打印的ASCII字符序列。目的是传输Unicode数据。主要的区别在于不用等号"="补余,因为该字符通常需要大量的转译。

标准可见RFC 2152,《A Mail-Safe Transformation Format of Unicode》。

IRCu

在IRCu等软件所使用的P10 IRC服务器间协议中,对客户与服务器的消息类型号(client/server numerics)和二进制IP地址采用了base64编码。消息类型号的长度固定为3字节,故可直接编码为4个字节而不需要加填充。对IP地址进行编码时,则需要在地址前添加一些0比特,使之可以编码为整数个字节。这里所用的符号集与前述MIME的也有所不同,将+/改成了[]。

在URL中的应用

Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java持久化系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSISQL中已将“%”号用作通配符。

为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。

此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。

其他应用

  • Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码
  • Base64也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。
  • 垃圾消息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的消息。
  • LDIF文件,Base64用作编码字符串。

外部链接

  • RFC 1421(Privacy Enhancement for Electronic Internet Mail)
  • RFC 2045(MIME)
  • RFC 3548(The Base16, Base32, and Base64 Data Encodings)
  • Base64的解码器
  • Base64的编码器
  • Base64在线转换工具
  • Home of the Base64 specification, with an online decoder and C99 implementation
  • 不同编程语言/应用程序的源代码/工具:
    • C
    • Java
    • MIME::Base64 Perl module
    • Firefox extension
    • emacs函数

参见

  • Radix-64
  • ASCII85
  • Quoted-printable
  • uuencode
  • yEnc
  • 8BITMIME
  • URL
[隐藏]
进位制的记数系统
基本进位制
一进位 ·二进制 · 三进位 · 四进位 · 五进位 · 六进制 · 七进位 · 八进制 · 九进位 · 十进制 · 十一进位 · 十二进制 · 十三进位 · 十四进位 · 十五进位 · 十六进制 · 十七进位 · 十八进制 · 十九进位 · 二十进制 · 二十四进位 · 二十六进制 · 二十七进位 · 三十进制 · 三十二进制 · 三十六进制 · 六十进制 · 六十四进位  · 八十五进位
 平衡进位制
平衡三进位 ·平衡五进位 · 平衡七进位 · 平衡九进位
 特殊进位制
Base64 ·十进位制 · 二进指数法 · 黄金进位 · 斐波那契编码 · e进位 · 2i进位 · 非整数进位制
 相关条目
 ·比特 · 进位制 · 米迪定理 · 记数系统
0 0
原创粉丝点击