Hex 和 Base64 编码
Hex 和 Base64 是最简单的密码学算法之一,严格来说他甚至不具备加密功能,只是一数据的表现方式,他们在传输视频、图片等二进制文件的时候经常发挥作用
# Hex 编码基础
Hex 编码是将数据转换成符合 Intel Hex 文件格式的一种编码方式,Hex 编码的最小单位是 1Byte 也即 8 个 bit 位,hex 算法流程如下:
- 将 1Byte 分成高 4bit 和低 4bit
- 算出高 4bit 对应的 16 进制数值,这里记为数值 a。Hex编码使用16个字符来表示数据,这16个字符分别是0-9的数字和 A-F 的字母(不区分大小写,即 a-f 和 A-F 是等价的)
- 将上面算出来的 2 个字符拼在一起就得到编码后的 2Byte 数据
Hex 解码就是将 Hex 编码的字符转换回它们所代表的原始二进制数据。解码过程相对简单,就是将每个 Hex 字符转换回对应的4位二进制数,然后将这些二进制数组合起来形成原始的二进制数据
# Hex 编码的特点
- 字符集合:Hex 编码使用的字符集是16进制的,包括数字0-9和字母 A-F。每个字符代表一个4位的二进制数(即半字节)
- 编码方式:每个字节(8位)的数据被转换为两个 Hex 字符。第一个字符代表字节的高4位,第二个字符代表字节的低4位
- 可读性:Hex 编码具有一定的可读性,特别是对于二进制数据来说。由于 Hex 编码使用人类熟悉的数字和字母来表示数据,因此它通常比直接显示二进制数据更容易理解。
- 长度:Hex 编码后的数据长度是原始数据的两倍。例如,一个字节的数据(8位)会被编码为两个 Hex 字符
- 应用场景:Hex 编码常用于表示二进制数据,特别是在需要直接查看或编辑二进制数据的场合,如硬件调试、网络通信、加密解密等。此外,许多编程语言中的颜色代码也是以 Hex 编码表示的
- 安全性:与 Base64 编码类似,Hex 编码本身并不提供任何加密或安全性。它只是一种表示数据的方式,不改变数据的本质
需要注意的是,Hex 编码和解码是可逆的,即可以通过编码将原始数据转换为 Hex 字符串,也可以通过解码将 Hex 字符串转换回原始数据,且不损失任何信息
# Hex 加密解密代码
/**
* 将16进制转换为二进制
* @param hexStr
* @return 解密后的 byte 数组
*/
public static byte[] hex2Byte(String hexStr) {
if (hexStr.length() < 1) return null;
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++) {
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
/**
* 将二进制转换成16进制
* @param buf
* @return
*/
public static String byte2Hex(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
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
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
# Base64 基础
讲一下 base64 是什么:
- Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法,由于 2^6=64,所以每 6 个比特为一个单元,对应某个可打印字符
- Base64 常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括 MIME 的电子邮件及 XML 的一些复杂数据
- Base64 编码要求把 3 个 8 位字节(38=24)转化为 4 个 6 位的字节(46=24),之后在 6 位的前面补两个 0,形成 8 位一个字节的形式。 如果剩下的字符不足 3 个字节,则用 0 填充
- Base64 编码后的输出还是按照 UTF-8 来输出
为什么要使用 Base64?
- 存储二进制数据:在某些情况下,需要将二进制数据存储到文本文件中,例如将图片或音频文件存储到数据库或文本文件中。由于文本文件只能存储文本数据,无法直接存储二进制数据,因此可以将二进制数据转换为 Base64 编码的文本,然后存储到文本文件中
- URL传参:在 URL 中传递参数时,某些字符可能会被 URL 编码,或者传的参数被误解为 url 的连接符,导致传递的参数变得很长。通过将参数进行 Base64 编码,可以将参数转换为可打印的 ASCII 字符,减少URL长度。
总之,使用 Base64 编码可以方便地将二进制数据转换为可打印的 ASCII 字符,以便在网络传输或存储到文本文件中
# Base64 编码方式
为了保证所输出的编码位可读字符,Base64 制定了一个编码表,以便进行统一转换。编码表的大小为 2^6=64,这也是 Base64 名称的由来
在 Base64 中的可打印字符包括字母 A-Z、a-z、数字 0-9,这样共有 62 个字符,此外两个可打印符号在不同的系统中而不同
以下是 Base64 编码的基本步骤:
- 将数据划分为 3 个字节一组(24位)
- 将每个字节转换为 8 位二进制形式
- 将 24 位数据按照 6 位一组进行划分,得到 4 个 6 位的组
- 将每个 6 位的组转换为对应的 Base64 字符
- 如果数据不足 3 字节,进行填充
- 将所有转换后的 Base64 字符连接起来,形成最终的编码结果
- 解码 Base64 编码的过程与编码相反,将每个 Base64 字符转换为对应的6位二进制值,然后将这些 6 位值组合成原始的二进制数据
Base64 编码具有以下特点:
- 编码后的数据长度总是比原始数据长约 1/3
- 编码后的数据可以包含 A-Z、a-z、0-9 和两个额外字符的任意组合
- Base64 编码是一种可逆的编码方式,可以通过解码还原原始数据
编码 Man 的结果为 TWFu,转换过程如下:
此外还有一个问题,Base64 加密后的数据通过 http 传输后,后台接收到的数据可能会出现空格的问题。这个问题还不知道具体原因,可能原因如下:
- 加号(+):url 编码后,会用 %2 替换原来位置的 +。这里 url 的编码规则是符号的 Unicode 值前面加一个 %。因此 + 对应的是 %2B,空格则是 %20
- form 表单提交,默认是 application/x-www-form-urlencoded,因此会对参数进行 urlencode
最后更新: 1/31/2026, 1:15:24 PM