Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Base64 #272

Open
yaofly2012 opened this issue Apr 17, 2023 · 0 comments
Open

Base64 #272

yaofly2012 opened this issue Apr 17, 2023 · 0 comments

Comments

@yaofly2012
Copy link
Owner

yaofly2012 commented Apr 17, 2023

Base64

Base64通常用于对二进制数据进行编码,即用字符串表示二进制数据。这样便于数据传输。

基础

Base64(基于64个字符的)是许多类似编码方案的通用术语,这些方案通过对二进制数据进行数字处理并将其转换为base-64 表示来对二进制数据进行编码。Base64 术语源自特定的 MIME 内容传输编码。

64个字符

组成 Base64 所需的64个字符的特定字符选择因实现而异。一般规则是选择一组 64 个字符:

  1. 大多数编码通用的子集的一部分
  2. 也可打印

这种组合使数据不太可能在通过电子邮件等系统传输时被修改,这些系统在传统上不是 8 位干净的。例如,MIME 的 Base64 实现对前62个值使用AZaz0-9,对后两个值使用+/。其他变体(源自Base64)共享此属性,但为最后两个值选择的符号可能不同;比如URL和文件名安全的“RFC 4648 / Base64URL”变体,它使用-_(即换成URL字符集的字符)。

image

实现原理

  1. 将给定的字符串以字符为单位,转换为对应的字符编码(ASCII)
  2. 将获得的字符编码转换为二进制码
  3. 对获得的二进制编码做分组操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时低位补0)
  4. 对获得的4-6二进制码补位,向6位二进制码添加2位高位0,组成4个8位二进制码
  5. 将获得的4-8二进制码转换为十进制码
  6. 将获得的十进制码转换为Base64字符表中对应的字符

举例子:原数据是字符串Man
image
即字符串ManBase64编码后是TWFu

使用场景

  1. 图片base64
  2. 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等还按照这个标准实行,所以会有又换行符。

参考

  1. Base64算法
  2. Android Base64编码出现换行
  3. Base64 Decode and Encode- Online
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant