字符串Base64编码经历了什么
以字符串Test
为例,进行Base64编码,进行详解。
1 字符编码阶段
在java中,字符串 Test 首先会按照指定的字符集。转换为字节数据。
String str = "Test" ;
byte[] byte = str.getBytes(StandardCharsets.UTF_8);
对于字符串 Test ,其对应的 Unicode 字符及其字节表示如下:
字符 | ASCII/Unicode码(十六进制) | UTF-8字节表示 |
---|---|---|
T | 0x54 | [0x54] |
e | 0x65 | [0x65] |
s | 0x73 | [0x73] |
t | 0x74 | [0x74] |
所以Test
的字节数组是:
byte[] bytes = new byte[] {0x54, 0x65, 0x73, 0x74};String s = new String( bytes );
System.out.println( s );
// 输出 Test
2 Base64 编码过程
Base64其实是将任意的二进制数据编码为 ASCII 字符串的方法,目的是让二进制数据可以仅支持文本传输或存储的环境下安全的传输。
Base64编码的基本原理是:
- 每三个字节的数据被拆分成4组,每组6位;
- 每组6位作为索引,在Base64编码表中找到对应的字符;
- 如果剩余的字节不足3个,则用 = 填充。
一、先对 [ 0x54, 0x65, 0x73 ] 进行编码:
这3个字节共24位
0x54 -> 01010100
0x65 -> 01100101
0x73 -> 01110011
合并为:
010101 000110 010101 110011
二、查 Base64 表:
6位值 | 十进制 | Base64编码 |
---|---|---|
010101 | 21 | V |
000110 | 6 | G |
010101 | 21 | V |
110011 | 51 | z |
所以Tes
被编码为 VGVz
。
对[0x74]
(即字母t
) 进行编码:
只有一个字节 0x74 -> 01110100
,需要填充:
011101 00xxxx xxxxxx xxxxxx
补零后变成
011101 000000 000000 000000
查表:
6位值 | 十进制 | Base64编码 |
---|---|---|
011101 | 29 | d |
000000 | 0 | A |
000000 | 0 | A |
000000 | 0 | A |
最后两个字节是填充的,所以替换为 ==
最终结果为:dA==
合并整个 Test
的 Base64 编码:
Tes
–> VGVz
t
--> dA==
最终结果: VGVzdA==