赞
踩
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中可打印字符包括字母A~Z、a~z、数字0~9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。
MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展,指的是一系列的电子邮件技术规范):在MIME格式的电子邮件中,Base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定Base64。使用的字符包括大小写英文字符各26个、数字10个、加号+和斜杠/,共64个字符,等号=用来作为后缀用途。
使用Base64编码后的数据比原始数据略长,为原来的4/3.在电子邮件中,根据RFC822规定,每76个字符,还需要加上一个回车换行。可以估算编码后的数据长度大约为原长的135.1%。转换的时候,将3字节的数据,先后放入一个24位的缓冲区中,先来的字节占高位。数据不足3字节的话,缓冲区中剩下的比特用0补足。每次取出6比特(因为2^6=64),按照其值选择ABCDEFGHIJKLMNOPQSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出,直到全部输入数据转换完成。若原数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=;若剩下2个输入数据,则在编码结果后加1个=。
UTF-7:是一个修改版Base64(Modified Base64)。主要是将UTF-16的数据,用Base64的方法编码为可打印的ASCII字符序列。目的是传输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中的/和+分别改成了-和_,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将+和/改成了!和-,因为+,*以及在IRCu中用到的[和]在正则表达式中都可能具有特殊含义。此外还有一些变种,它们将+/改为_-或._(用作编程语言中的标识符名称)或._(用于XML中的Nmtoken)甚至_:(用于XML中的Name)。
Base64编码过程:(1). 将原数据每三个字节作为一组,一共是24个二进制位;(2). 将这24个二进制位分为四组,每个组有6个二进制;(3). 在每组前面加两个00扩展成32个二进制位,即四个字节;(4). 根据下图中的Base64索引表,得到扩展后的每个字节对应的符号:
网上关于Base64的开源软件很多,如 cppcodec ,还有对各种Base64开源软件性能的分析,如 https://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c ,还有一些Base64在线编解码网站如 http://base64.xpcha.com/
以上整理的内容主要来自维基百科。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。