Java中字符串与十六进制转换分两类:一是Hex字符串(如"a1b2c3")与byte数组互转,需偶数长度且字符合法,推荐Java 17+的HexFormat;二是文本字符串经指定编码(如UTF-8)转byte数组再转Hex,反向需严格匹配编码,否则乱码。

Java 中字符串的十六进制(Hex)表示和 byte 数组之间的转换,核心在于明确“字符串”指的是哪种形式:是原始字节数据的 Hex 编码字符串(如 "68656c6c6f"),还是 Unicode 字符串经某种字符编码(如 UTF-8)转成的 byte 数组再转 Hex。下面分两种常见场景说明:
Hex 字符串 ↔ byte 数组(最常用)
这是指把一串十六进制字符(如 "a1b2c3")解析为对应的字节数组,或把字节数组格式化为小写/大写的十六进制字符串。
- Hex 字符串 → byte[]:每两个字符代表一个字节,需逐对解析。推荐使用
java.util.HexFormat(Java 17+)或 Apache Commons Codec 的Hex.decodeHex();若用原生方式,可用Integer.parseInt(hexPair, 16)转为 int 再强转byte - byte[] → Hex 字符串:同样推荐
HexFormat.of().formatHex(bytes)(默认小写,可链式调用.withUpperCase());手动实现时,对每个 byte 取低 4 位查表("0123456789abcdef"),拼接两位字符 - 注意:Hex 字符串长度必须为偶数,否则解析会抛异常;非法字符(如 'g')也会失败
String(文本) ↔ byte[] ↔ Hex(按编码转换)
这是指先将普通字符串(如 "你好")按指定字符编码(如 UTF-8)转成 byte[],再将该 byte[] 转为 Hex 字符串;反向则需先 Hex→byte[],再用相同编码 new String(byte[], charset)。
- String → Hex:先
str.getBytes(StandardCharsets.UTF_8)得到 byte[],再用上述 HexFormat 转成字符串 - Hex → String:先 Hex 字符串转 byte[],再
new String(bytes, StandardCharsets.UTF_8);若编码不匹配(比如用 UTF-8 解码 GBK 编码的字节),会出现乱码 - 关键点:字符编码必须前后一致,否则无法还原原文
工具类建议与避坑提示
避免手写重复逻辑,优先使用标准库或成熟工具。
立即学习“Java免费学习笔记(深入)”;
- Java 17+ 直接用
HexFormat:简洁、安全、支持大小写和分隔符(如HexFormat.of().withDelimiter(" ").formatHex(bytes)) - 兼容旧版本可用
DatatypeConverter.parseHexBinary()(javax.xml.bind,但 Java 9+ 默认不包含,需额外引入) - Apache Commons Codec 更稳定:引入
commons-codec后用Hex.encodeHexString(bytes)和Hex.decodeHex(hexStr.toCharArray()) - 别混淆
String.getBytes()无参重载——它依赖系统默认编码,不可靠,务必显式传入StandardCharsets.UTF_8
不复杂但容易忽略编码和边界校验,理清“哪段是原始数据、哪段是它的十六进制表示”,就能准确转换。


















