java中将十六进制字符串转字节数组需确保长度为偶数,每两位解析为一个字节,忽略大小写,非法字符应抛异常;推荐手动实现或使用apache commons codec的hex.decodehex方法。

Java 中将十六进制字符串(如 "a1b2c3")转为字节数组,核心是按每两个字符解析为一个字节,注意大小写不敏感、长度需为偶数、非法字符要处理。
基础实现:手动解析(推荐掌握原理)
十六进制字符串中每两个字符代表一个字节(00–FF),所以先校验字符串长度是否为偶数,再逐对截取并用 Integer.parseInt(..., 16) 转换:
- 字符串长度必须是偶数,否则无法完整配对,建议提前抛异常或截断
- 使用
substring(i, i+2)取两位,调用Integer.parseInt(s, 16)得到 0–255 的 int 值 - 强转为
byte即可(Java 中 byte 是有符号的,但高位补全逻辑正确,无需额外处理) - 忽略大小写:传入前统一转为小写或大写,
parseInt默认支持大小写混合
使用 Apache Commons Codec(简洁可靠)
引入依赖后一行搞定,内部已处理空格、大小写、异常等边界情况:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- Maven 依赖:
org.apache.commons:commons-codec:1.15+ - 代码:
Hex.decodeHex("A1B2c3")→ 返回byte[] - 若字符串含空格或前缀(如
"0xA1 0xB2"),需先清洗;它不自动跳过非十六进制字符
注意事项与常见坑
实际使用中容易出错的地方:
-
字符串为空或 null:必须判空,否则 NPE;空串应返回空数组
new byte[0] -
长度为奇数:例如
"abc"—— 不能直接解析,建议明确抛IllegalArgumentException -
非法字符:如
"xz"不是合法 hex 字符,parseInt会抛NumberFormatException,应捕获并给出清晰提示 -
字节高位问题:
0xFF解析为 int 是 255,转byte后是-1,这是正常行为,不影响后续序列化或网络传输
完整示例(无依赖版)
一个健壮、可直接复用的工具方法:
public static byte[] hexStringToBytes(String hex) {
if (hex == null || hex.isEmpty()) return new byte[0];
if (hex.length() % 2 != 0) throw new IllegalArgumentException("Hex string length must be even");
hex = hex.trim();
byte[] bytes = new byte[hex.length() / 2];
for (int i = 0; i Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










