java将字节数组转16进制字符串需先用b & 0xff转无符号整数,再格式化为两位小写十六进制;推荐string.format("%02x", b & 0xff),或apache commons codec的hex.encodehexstring(),高性能场景可用查表法。

Java 中将字节数组转为 16 进制字符串,核心是把每个 byte 值(-128 ~ 127)无符号解释为 0 ~ 255 的整数,再格式化为两位十六进制字符(如 0a、ff)。关键要避免直接用 Integer.toHexString(b),因为负数会输出带符号的补码形式(如 -1 变成 ffffffff)。
使用 String.format(简洁可靠)
适合小到中等长度数组,代码清晰,不易出错:
- 对每个字节执行
& 0xFF强制转为无符号 int - 用
%02x格式化:0表示前导零补齐,2表示最小宽度,x表示小写十六进制
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
byte[] data = { (byte)0xAB, (byte)0xCD, 0x01, -1 }; // 即 [ab, cd, 01, ff]
StringBuilder sb = new StringBuilder();
for (byte b : data) {
sb.append(String.format("%02x", b & 0xFF));
}
String hex = sb.toString(); // "abcd01ff"
使用 Apache Commons Codec(一行解决)
如果项目已引入 commons-codec,最省事:
- Maven 依赖:
org.apache.commons:commons-codec:1.15+ - 调用
Hex.encodeHexString(byte[]),默认小写;加true参数可大写
示例:
import org.apache.commons.codec.binary.Hex; // ... String hex = Hex.encodeHexString(data); // "abcd01ff" String hexUpper = Hex.encodeHexString(data, true); // "ABCD01FF"
手动查表法(高性能,无依赖)
适用于高频调用或对性能敏感场景,避免字符串格式化开销:
- 预定义长度为 16 的字符数组:
char[] HEX_ARRAY = {'0','1',..., 'f'} - 对每个字节:取高 4 位 →
(b >> 4) & 0xF,取低 4 位 →b & 0xF - 分别查表拼接两个字符
示例:
final char[] HEX_ARRAY = "0123456789abcdef".toCharArray();
char[] hexChars = new char[data.length * 2];
for (int i = 0; i >> 4];
hexChars[i * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
String hex = new String(hexChars); // "abcd01ff"
注意大小写与空格分隔
多数场景用小写紧凑格式(如 "a1b2c3"),但某些协议要求大写或带空格/冒号分隔:
- 大写:把
%02x改成%02X,或用Hex.encodeHexString(data, true) - 每字节后加空格:在循环内每次追加
sb.append(String.format("%02x ", b & 0xFF)),最后 trim - 用冒号分隔(如
"ab:cd:01:ff"):用String.join(":", Arrays.stream(...).map(...).toArray(String[]::new))
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










