21xrx.com
2025-06-16 11:34:28 Monday

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索引表:

数值字符     数值字符     数值字符     数值字符
0A     16Q     32g     48w
1B     17R     33h     49x
2C     18S     34i     50y
3D     19T     35j     51z
4E     20U     36k     520
5F     21V     37l     531
6G     22W     38m     542
7H     23X     39n     553
8I     24Y     40o     564
9J     25Z     41p     575
10K     26a     42q     586
11L     27b     43r     597
12M     28c     44s     608
13N     29d     45t     619
14O     30e     46u     62+
15P     31f     47v     63/

如果要编码的字节数不能被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=
  
  

评论区

21技术    www.21xrx.com 备案号:蜀ICP备17043188号-2