Java教程

DS&A - Base64

本文主要是介绍DS&A - Base64,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 前言
  • 索引表
  • 原理
  • 解决问题


前言

Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。由于 log ⁡ 2 64 = 6 \log_{2}64=6 log2​64=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 这样的编码方式。

这篇关于DS&A - Base64的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!