21xrx.com
2024-03-05 22:36:56 Tuesday
登录

Base64

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

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据.

MIME

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

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

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

若原数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=;若剩下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”

文本Man
ASCII编码7797110
二进制位 01001101 01100001 01101110
ASCII编码192546
base64编码TWFu

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

Base64索引表:

数值字符     数值字符     数值字符     数值字符
{{item[0]}}{{item[1]}}     {{item[2]}}{{item[3]}}     {{item[4]}}{{item[5]}}     {{item[6]}}{{item[7]}}

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

文本(1Byte)A  
二进制位 01000001
二进制位(补零) 01000001 0000                         
base64编码QQ==
字符(char)BC 
二进制位 01000010 01000110
二进制位(补零) 01000010 01000110 00            
base64编码QkM=
  
  

评论区

{{item['qq_nickname']}}
()
回复
回复
21技术    www.21xrx.com 备案号:蜀ICP备17043188号-2