java中将16进制字符串转字节数组有两种方式:一是用apache commons codec的hex.decodehex(),简洁安全;二是手写解析,需校验长度、统一大小写,用character.digit()逐位转换。

Java 中将 16 进制字符串(如 "a1b2c3")转为字节数组,核心是按每两个字符解析为一个字节,再用 Integer.parseInt(..., 16) 或更高效的方式处理。
使用 Apache Commons Codec(推荐,简洁安全)
如果你项目中已引入或可添加依赖,这是最稳妥的方式:
- Maven 依赖:
commons-codec commons-codec 1.15 - 代码示例:
import org.apache.commons.codec.binary.Hex;<br> byte[] bytes = Hex.decodeHex("a1b2c3"); // 返回 [0xa1, 0xb2, 0xc3] - 自动校验长度是否为偶数,非法字符会抛
DecoderException
手写解析(无依赖,适合轻量场景)
确保输入字符串长度为偶数、只含合法十六进制字符(0-9a-fA-F),然后逐两位转换:
- 先转小写或统一大小写,避免大小写混合问题
- 用
Character.digit(c, 16)安全获取单个字符的数值(比parseInt更轻量) - 每两个字符组合:高位 × 16 + 低位
示例代码:
public static byte[] hexStringToBytes(String hex) {
if (hex == null || hex.length() % 2 != 0) {
throw new IllegalArgumentException("Hex string must have even length");
}
hex = hex.toLowerCase();
byte[] bytes = new byte[hex.length() / 2];
for (int i = 0; i <h3>注意常见坑</h3>
-
前导空格或 "0x" 前缀需手动去除:如
"0xa1b2"或" a1b2 "要先trim().replace("0x", "") - 空字符串或 null 必须判空,否则 NPE 或逻辑错误
- 区分大小写不是问题,但建议统一处理(如转小写),避免某些解析器行为不一致
- Java 17+ 可用
java.util.HexFormat(标准库新增):HexFormat.of().parseHex("a1b2c3")—— 简洁且内置校验,推荐新项目使用
验证是否成功
转换后可用 Arrays.toString(bytes) 查看结果,或用 Hex.encodeHexString(bytes) 再转回字符串对比,确认无损:
String original = "a1b2c3"; byte[] b = Hex.decodeHex(original); String back = Hex.encodeHexString(b); // → "a1b2c3"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











