新特性09| Base64

简介

Base64 is a binary-to-text encoding scheme that represents binary data in a printable ASCII string format by translating it into a radix-64 representation. Each Base64 digit represents exactly 6 bits of binary data.

(译文)Base64是一个二进制转换为文本的编码方案,它将二进制数转为radix-64编码数,从而能用ASCII字符串表示二进制数,每一个Base64数刚好能表示6为二进制数。

说明

  1. Base64用来防止信息系统传输的数据被改变,例如在email中,可能不是8位清洁的(可能会是8位乱码)。比如在邮件中添加了图片附件,然后希望图片到达后不会出现乱码等情况。邮件程序可以用Base64编码图片附件,然后将其以相应的文本形式插入到邮件信息中。

  2. Java8目前内置了Base64的编码器和译码器,通过静态方法可以获取到下方3种编译码器:

    • 基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/;
    • URL:输出被映射到一组字符A-Za-z0-9+_,输出是URL和文件;
    • MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型):输出被映射到MIME的友好格式。输出每行不超过76字符,并且使用回车符’\r’加换行符’\n’作为分割。编码输出最后没有行分割符。

tip:回车符(carriage return, ‘\r’)使光标移到行首,换行符(line feed, ‘\n’)是使光标下移一行。

Base64编码和译码

Base64依靠一个简单的编码和译码算法。它使用一个含65个字符的US-ASCII字符集,其中前64个字符每个都按顺序映射为一个6位二进制数。下方为映射表:

Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y

Note: 第65个字符(=)用于填补空白,比如用1个或2个’=’将字符串填充到适当长度。

Base64实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.UUID;

public class Java8Tester {
public static void main(String[] args) {
// 定义一个字符串
String basicStr = "http://localhost:8080/search?id=1";

// 基本编码
String base64EncodedString = Base64.getEncoder().encodeToString(basicStr.getBytes(StandardCharsets.UTF_8));
System.out.println("Base64 编码字符串 (基本) :" + base64EncodedString);
// 基本解码
byte[] base64DecodedBytes = Base64.getDecoder().decode(base64EncodedString);
System.out.println("原始字符串: " + new String(base64DecodedBytes, StandardCharsets.UTF_8));
System.out.println("---------------------------------------------------------------------\n");

// URL编码
base64EncodedString = Base64.getUrlEncoder().encodeToString(basicStr.getBytes(StandardCharsets.UTF_8));
System.out.println("Base64 编码字符串 (URL) :" + base64EncodedString);
// URL译码
byte[] base64UrlDecodeBytes = Base64.getUrlDecoder().decode(base64EncodedString);
System.out.println("原始字符串: " + new String(base64UrlDecodeBytes, StandardCharsets.UTF_8));
System.out.println("---------------------------------------------------------------------\n");

// 构建一个由10个UUID随机组成的字符串
// UUID(Universally Unique Identifier, 通用唯一识别码)
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10; ++i) {
stringBuilder.append(UUID.randomUUID().toString());
}
byte[] mimeBytes = stringBuilder.toString().getBytes(StandardCharsets.UTF_8);

// MIME编码
String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
System.out.println("Base64 编码字符串 (MIME) :" + mimeEncodedString);

// MIME译码
byte[] mimeDecodedBytes = Base64.getMimeDecoder().decode(mimeEncodedString);
System.out.println("原始字符串: " + new String(mimeDecodedBytes, StandardCharsets.UTF_8));

}
}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Base64 编码字符串 (基本) :aHR0cDovL2xvY2FsaG9zdDo4MDgwL3NlYXJjaD9pZD0x
原始字符串: http://localhost:8080/search?id=1
---------------------------------------------------------------------

Base64 编码字符串 (URL) :aHR0cDovL2xvY2FsaG9zdDo4MDgwL3NlYXJjaD9pZD0x
原始字符串: http://localhost:8080/search?id=1
---------------------------------------------------------------------

Base64 编码字符串 (MIME) :ZDM4MmEwNDgtNzZjMy00OWM4LTlhMzQtYmVlOWU2YTNhMDAyYzQxZTIwMjItMTRhOC00ZTc3LThk
YTYtNzQ5NTJlZmI0ZGRmMDhmODA0NTYtMzRkZC00YzExLWE3YTgtNjg5YTU1NGI2NjVlOGFhYjk2
MzUtZjVkOS00MjAzLWE1NzgtM2I3OWM2ZDFlYmM2MTZjZmQ5MDEtNWQ2ZC00ZjNkLWIzNTYtOWVl
YWY3OTY2ZTU4ZGRiOTFlOGYtZWM4My00NzE4LThlZmMtZGZkZDY2YWE3ZTc1MjYyOWZiYWUtNjU4
Ni00NGRhLTgzNDAtY2VlM2NjOWJjYjk1MjkzNzFmNzMtZGNkOS00NjljLWFlMDItZmQ5YTNjYzM4
MjE5ZmJhM2Q0MzgtYmE1Zi00YzRhLTkxZWMtNTBiYjU3YTg1YzZjYzkyOWQyMTItOWNjOS00MDlh
LTg4N2YtZGY4YjAzMjVlOWI1
原始字符串: d382a048-76c3-49c8-9a34-bee9e6a3a002c41e2022-14a8-4e77-8da6-74952efb4ddf08f80456-34dd-4c11-a7a8-689a554b665e8aab9635-f5d9-4203-a578-3b79c6d1ebc616cfd901-5d6d-4f3d-b356-9eeaf7966e58ddb91e8f-ec83-4718-8efc-dfdd66aa7e752629fbae-6586-44da-8340-cee3cc9bcb9529371f73-dcd9-469c-ae02-fd9a3cc38219fba3d438-ba5f-4c4a-91ec-50bb57a85c6cc929d212-9cc9-409a-887f-df8b0325e9b5

更多详细内容参见官方文档

码哥 wechat
欢迎关注个人订阅号:「码上行动GO」