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.编码后的数据比原始数据略长, 为原来的 4⁄3.在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行.\ 可以估算编码后数据长度大约为原长的135.1%.
转换的时候,将3字节的数据,先后放入一个24位的缓冲区中,先来的字节占高位.数据不足3字节的话, 于缓冲器中剩下的比特用0补足.每次取出6比特(因为 26=64), 按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出,直到全部输入数据转换完成.
若原数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=;若剩下2个输入数据,则在编码结果后加1个=.
例子
举例来说,下面是一段文字:
经过Base64编码之后变成:
编码“Man”
文本 | M | a | n | |||||||||||||||||||||
ASCII编码 | 77 | 97 | 110 | |||||||||||||||||||||
二进制位 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
ASCII编码 | 19 | 2 | 5 | 46 | ||||||||||||||||||||
base64编码 | T | W | F | u |
在此例中,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 | |||||||||||||||||||||||
二进制位 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | ||||||||||||||||
二进制位(补零) | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | ||||||||||||
base64编码 | Q | Q | = | = |
字符(char) | B | C | ||||||||||||||||||||||
二进制位 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | ||||||||
二进制位(补零) | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | ||||||
base64编码 | Q | k | M | = |
评论区