java中将字节数组转十六进制字符串推荐三种方式:1. string.format("%02x", b)(简洁清晰,适合小数据);2. java 17+ 的hexformat(安全高效,支持大小写与分隔符);3. 手写查表法(兼容老版本、性能最优,需用b & 0xff处理符号位)。

Java 中将字节数组转为十六进制字符串,核心是把每个 byte 拆成高 4 位和低 4 位,分别映射为 0–9 或 a–f 字符,拼接成两位十六进制表示。推荐用标准库或简洁可靠的手写方式,避免手动查表或依赖过时 API(如 BigInteger.toString(16) 会丢前导零、负数处理复杂)。
用 String.format(适合小数据、代码简洁)
对每个字节调用 String.format("%02x", b),%02x 表示以小写十六进制输出、不足两位补前导零:
public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
✅ 优点:逻辑清晰、无需额外依赖;⚠️ 注意:频繁字符串拼接时,StringBuilder 比直接用 + 高效。
用 java.util.HexFormat(Java 17+ 推荐)
JDK 17 引入的 HexFormat 是官方首选,支持大小写、分隔符、编码/解码,且性能好、线程安全:
- 默认小写无分隔符:
HexFormat.of().formatHex(bytes) - 大写:
HexFormat.ofUpperCase().formatHex(bytes) - 每两个字符加空格:
HexFormat.of().withDelimiter(" ").formatHex(bytes)
✅ 安全、高效、可读性强;❌ 不适用于 Java 17 以下版本。
手写查表法(兼容老版本、性能最优)
定义长度为 16 的字符数组 hexArray = "0123456789abcdef".toCharArray(),对每个字节 b,取 hexArray[(b >> 4) & 0xF] 和 hexArray[b & 0xF]:
private static final char[] HEX_ARRAY = "0123456789abcdef".toCharArray();
<p>public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length <em> 2];
for (int i = 0; i 2] = HEX_ARRAY[v >>> 4];
hexChars[i * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}</em></p>
✅ 零分配(除结果字符串外)、无格式化开销、兼容所有 JDK 版本;? 关键点:bytes[i] & 0xFF 把有符号 byte 转为 0–255 的正整数,避免高位补 1 导致错误。
不推荐的方式(避坑提醒)
-
new BigInteger(1, bytes).toString(16):会丢前导零,且负字节数组(如含0xFF)因符号位被误判为负数,结果完全错误 -
DatatypeConverter.printHexBinary(bytes)(JAXB):已废弃,且返回大写,不易控制格式 - 直接循环 +
Integer.toHexString(b & 0xFF):需手动补零(length == 1 ? "0" + s : s),冗余且易错
不复杂但容易忽略细节,选对方法能省去调试前导零和负数问题的时间。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











