- 将 16 进制格式的
String转换回原始的文本String("48656C6C6F"转换为"Hello")。 - 将一个字节数组 转换为 16 进制的
String表示形式(这是 16 进制转换的“反向”操作,但经常被一起讨论)。
下面我将详细讲解这两种情况,并提供最常用和推荐的方法。

将 16 进制字符串转换为文本字符串
这是最直接的情况,比如你有一个 16 进制编码的字符串,想把它解码成人类可读的文本。
方法 1:使用 javax.xml.bind.DatatypeConverter (最简单)
这是最简单、最直接的方法,不需要任何第三方库,它适用于 Java 6, 7, 8, 9, 10, 11,从 Java 9 开始,它被移到了 java.xml.bind 模块中,需要手动引入。
代码示例 (Java 8 及更早版本,无需额外操作):
public class HexToString {
public static void main(String[] args) {
// 一个表示 "Hello World" 的 16 进制字符串
String hexString = "48656C6C6F20576F726C64";
// 使用 DatatypeDecoder 将 16 进制字符串解码为字节数组
byte[] bytes = DatatypeConverter.parseHexBinary(hexString);
// 使用 String 的构造函数将字节数组转换为 String
// "UTF-8" 是一种常用的字符编码,必须与编码时使用的编码一致!
String result = new String(bytes, "UTF-8");
System.out.println("原始 16 进制字符串: " + hexString);
System.out.println("转换后的文本字符串: " + result); // 输出: Hello World
}
}
代码示例 (Java 9 及更高版本,需要添加模块声明):

如果你使用的是 Java 9 或更高版本,并且遇到 DatatypeConverter 找不到的问题,需要在 module-info.java 文件中添加 java.xml.bind 模块:
// module-info.java
module your.module.name {
requires java.xml.bind;
}
方法 2:使用 Apache Commons Codec (推荐)
如果你已经在使用 Apache Commons 库,或者希望代码更具可移植性(不依赖 Java 内部 API),这是最好的选择。
添加依赖:
如果你使用 Maven,在 pom.xml 中添加:

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version> <!-- 使用最新版本 -->
</dependency>
如果你使用 Gradle,在 build.gradle 中添加:
implementation 'commons-codec:commons-codec:1.15' // 使用最新版本
代码示例:
import org.apache.commons.codec.binary.Hex;
public class HexToStringApache {
public static void main(String[] args) {
String hexString = "48656C6C6F20576F726C64";
// Hex.decodeHex() 方法直接返回字节数组
byte[] bytes = Hex.decodeHex(hexString.toCharArray());
// 将字节数组转换为 String
String result = new String(bytes, "UTF-8");
System.out.println("原始 16 进制字符串: " + hexString);
System.out.println("转换后的文本字符串: " + result); // 输出: Hello World
}
}
将字节数组转换为 16 进制字符串
这是“16 进制转 string”更常见的含义,即把二进制数据(如文件内容、哈希值)用 16 进制字符表示出来。
方法 1:使用 javax.xml.bind.DatatypeConverter (最简单)
和上面一样,这个类也提供了非常方便的方法。
代码示例:
import javax.xml.bind.DatatypeConverter;
public class BytesToHex {
public static void main(String[] args) {
String text = "Hello";
byte[] bytes = text.getBytes(); // 默认使用平台编码,最好明确指定
// 使用 DatatypeConverter 将字节数组转换为 16 进制字符串
String hexString = DatatypeConverter.printHexBinary(bytes);
System.out.println("原始文本: " + text);
System.out.println("字节数组: " + java.util.Arrays.toString(bytes));
System.out.println("16 进制字符串: " + hexString); // 输出: 48656C6C6F
}
}
方法 2:使用 Apache Commons Codec (推荐)
同样,如果你使用 Apache Commons Codec,代码也非常简洁。
代码示例:
import org.apache.commons.codec.binary.Hex;
public class BytesToHexApache {
public static void main(String[] args) {
String text = "Hello";
byte[] bytes = text.getBytes();
// Hex.encodeHexString() 方法直接返回 16 进制字符串
String hexString = Hex.encodeHexString(bytes);
System.out.println("原始文本: " + text);
System.out.println("字节数组: " + java.util.Arrays.toString(bytes));
System.out.println("16 进制字符串: " + hexString); // 输出: 48656C6C6F
}
}
总结与推荐
| 操作 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| Hex -> String | DatatypeConverter |
无需外部库,一行代码搞定 | Java 9+ 需要手动添加模块 |
| Apache Commons Codec | 代码清晰,跨版本兼容性好,功能强大 | 需要引入第三方依赖 | |
| Bytes -> Hex | DatatypeConverter |
无需外部库,一行代码搞定 | Java 9+ 需要手动添加模块 |
| Apache Commons Codec | 代码清晰,跨版本兼容性好,功能强大 | 需要引入第三方依赖 |
核心要点:
- 编码是关键: 在
byte[]和String之间转换时,必须指定字符编码(如"UTF-8"),如果编码和解码时使用的编码不一致,就会出现乱码,在 Java 中,强烈推荐始终使用StandardCharsets.UTF_8,它比字符串字面量更安全。// 推荐写法 String result = new String(bytes, StandardCharsets.UTF_8); byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
- 选择方法:
- 如果你的项目已经依赖了 Apache Commons,或者你希望代码不依赖 Java 内部模块,使用 Apache Commons Codec 是最稳妥、最现代的选择。
- 如果你只是想快速写一个简单的工具,且不介意 Java 版本问题,
DatatypeConverter是最快的选择。
希望这个详细的解释能帮助你!
