Base64 是一种将2进制数据编码为 ASCII 字符的编码方式。它主要用于在文本环境中传输或存储二进制数据,例如在电子邮件、URL 或 JSON 中传输文件或图像数据。Base64 编码后的数据由 64 个字符(A-Z, a-z, 0-9, '+', '/')组成,并且可能包含填充字符 =
。
Base64是一种“二进制转换到文本”的编码方式,它能够将任意二进制数据转换为ASCII字符串的形式,以便在只支持文本的环境中也能够顺利地传输二进制数据。
(1)base64编码:把二进制数据转为字符;
(2)base64解码:把字符转为二进制数据;
Base64 编码的原理
-
输入数据分组:
-
将二进制数据按每 3 个字节(24 位)分为一组。
-
如果最后一组不足 3 个字节,则用 0 填充。
-
-
转换为 6 位单位:
-
将 24 位数据分为 4 个 6 位的单位。
-
每个 6 位的单位可以表示 0 到 63 的数值。
-
-
映射到 Base64 字符表:
-
将每个 6 位的数值映射到 Base64 字符表中的对应字符。
-
Base64 字符表为:
A-Z, a-z, 0-9, '+', '/'
。
-
-
填充字符:
-
如果最后一组不足 3 个字节,编码后会少 1 或 2 个字符,此时用
=
填充。
-
Base64 编码示例
假设输入数据为 Man
(ASCII 值为 77 97 110
):
-
二进制表示:
M (77) -> 01001101 a (97) -> 01100001 n (110) -> 01101110
-
合并为 24 位:
01001101 01100001 01101110
-
分为 4 个 6 位单位:
010011 010110 000101 101110
-
转换为十进制:
19 22 5 46
-
映射到 Base64 字符表:
19 -> T 22 -> W 5 -> F 46 -> u
-
编码结果:
TWFu
Base64 填充示例
如果输入数据为 Ma
(ASCII 值为 77 97
):
-
二进制表示:
M (77) -> 01001101 a (97) -> 01100001
-
合并为 16 位(不足 24 位,填充 0):
01001101 01100001 00000000
-
分为 4 个 6 位单位:
010011 010110 000100 000000
-
转换为十进制:
19 22 4 0
-
映射到 Base64 字符表:
19 -> T 22 -> W 4 -> E 0 -> A
-
填充
=
:因为原始数据只有 2 字节,所以需要填充 1 个 =。
-
编码结果:
TWE=
Base64 字符表
索引 | 字符 | 索引 | 字符 | 索引 | 字符 | 索引 | 字符 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
Base64 的应用场景
-
数据传输:
-
在 HTTP 请求中传输二进制数据(如图片、文件)。
-
在 JSON 中嵌入二进制数据。
-
-
数据存储:
-
将二进制数据存储为文本格式(如数据库中的 BLOB 字段)。
-
-
URL 安全:
-
使用 URL 安全的 Base64 变种(将
+
和/
替换为-
和_
)。
-
-
电子邮件:
-
在电子邮件中传输附件。
-
Base64 的优缺点
优点:
-
将二进制数据转换为文本格式,便于在文本环境中传输和存储。
-
编码和解码算法简单,易于实现。
缺点:
-
编码后的数据比原始数据大 33%(每 3 字节编码为 4 字符)。
-
不适合加密敏感数据,因为 Base64 不是加密算法。
Java 中的 Base64 实现
Java 提供了内置的 Base64 工具类(java.util.Base64
),可以方便地进行编码和解码:
import java.util.Base64;
public class Base64Example {
public static void main(String[] args) {
String original = "Hello, World!";
// 编码
String encoded = Base64.getEncoder().encodeToString(original.getBytes());
System.out.println("Encoded: " + encoded); // SGVsbG8sIFdvcmxkIQ==
// 解码
byte[] decodedBytes = Base64.getDecoder().decode(encoded);
String decoded = new String(decodedBytes);
System.out.println("Decoded: " + decoded); // Hello, World!
}
}
总结
Base64 是一种常用的编码方式,适用于在文本环境中传输或存储二进制数据。它的核心思想是将二进制数据转换为 ASCII 字符,并通过填充字符 =
处理不足 3 字节的情况。