DS&A - Base64


前言

Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。由于 log ⁡ 2 64 = 6 \log_{2}64=6 log264=6,所以每 6 比特为一个单元,对应某个可打印字符
3 个字节相当于 24 个比特,对应于 4 个 Base64 单元,即 3 个字节可由 4 个可打印字符来表示。在 Base64 中的可打印字符包括字母 A-Z、a-z、数字 0-9,这样共有 62 个字符,此外两个可打印符号在不同的系统中而不同。
一些如 uuencode 的其他编码方法,和之后 BinHex 的版本使用不同的 64 字符集来代表 6 个二进制数字,但是不被称为 Base64。

以上是维基百科对 Base64 的描述。也就是说 Base64 是一种二进制到文本的编码方式,而且该文本只包含 ASCII 的可见字符

索引表

数值字符数值字符数值字符数值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

原理

hello

如上图所示,字符串 hello 经过 Base64 编码则生成 aGVsbG8=,ASCII 字符不足则 Base64 用 0 比特补足,若 Base64 单元不为 4 的倍数也用 0 比特补足,但展示为 =, 表示为填充位。

对应 Java 代码为:

// JDK 17
var arr = "hello".getBytes(StandardCharsets.UTF_8);
var ints = new ArrayList<Integer>(arr.length);
for (byte b : arr) {
    ints.add(b & 0xFF);
}
ints.stream()
        .map(b -> Integer.toBinaryString(b & 0xFF))
        .map(s -> String.format("%8s", s).replace(' ', '0'))
        .forEach(System.out::println);

var base64 = Base64.getEncoder().encodeToString(arr);
System.out.println(base64);

输出如下:

01101000
01100101
01101100
01101100
01101111
aGVsbG8=

解决问题

从 Base64 的定义中我们可以知道,Base64 把所有不可见字符都转为可见字符了,那么 Base64 主要也就是处理文本协议在传输过程中不可见字符的问题了。在网络交换数据的时候,数据需要经过多个路由设备,由于不同设备处理对不可见字符处理的不同,可能出现错误的处理,这是不利于传输的,于是乎就出现 Base64 这样的编码方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值