yaofly2012 / note

Personal blog

Home Page:https://github.com/yaofly2012/note/issues

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Base64

yaofly2012 opened this issue · comments

commented

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