Base64
yaofly2012 opened this issue · comments
Base64
Base64通常用于对二进制数据进行编码,即用字符串表示二进制数据。这样便于数据传输。
基础
Base64(基于64个字符的)是许多类似编码方案的通用术语,这些方案通过对二进制数据进行数字处理并将其转换为base-64 表示来对二进制数据进行编码。Base64 术语源自特定的 MIME 内容传输编码。
64个字符
组成 Base64 所需的64个字符的特定字符选择因实现而异。一般规则是选择一组 64 个字符:
- 大多数编码通用的子集的一部分
- 也可打印
这种组合使数据不太可能在通过电子邮件等系统传输时被修改,这些系统在传统上不是 8 位干净的。例如,MIME 的 Base64 实现对前62个值使用AZ
、az
和0-9
,对后两个值使用+
和/
。其他变体(源自Base64)共享此属性,但为最后两个值选择的符号可能不同;比如URL和文件名安全的“RFC 4648 / Base64URL”变体,它使用-
和_
(即换成URL字符集的字符)。
实现原理
- 将给定的字符串以字符为单位,转换为对应的字符编码(ASCII)
- 将获得的字符编码转换为二进制码
- 对获得的二进制编码做分组操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时低位补0)
- 对获得的4-6二进制码补位,向6位二进制码添加2位高位0,组成4个8位二进制码
- 将获得的4-8二进制码转换为十进制码
- 将获得的十进制码转换为Base64字符表中对应的字符
举例子:原数据是字符串Man
即字符串Man
Base64编码后是TWFu
。
使用场景
- 图片base64
- URL base64,要使用专门URL base64算法
可用于中间页面跳转目标页面:
const targetUrl = 'https://test.com?age=12';
const middleUrl = `https://test.com/direct?target=${base64(targetUrl)}`
如果直接使用encodeURIComponent
在IOS里可能会decode,导致中间页无法正确提取target URL。
Issues/Concern
Base64编码字节占用更多了
Base64是一种字符串编码格式,Base64采用A-Za-z0-9+/
这一共64个字符来编码原始字符(还有垫字符=
)。一个字符本身是1个字节,也就是8位,而Base64编码后的一个字符只能表示能表示6位的信息。也就是原始字符串中3字节的信息编码会变成4字节的信息
Base64和回车换行
根据RFC822规定,BASE64Encoder编码每76个字符,还需要加上一个回车换行 部分Base64编码的java库,OC等还按照这个标准实行,所以会有又换行符。