杰瑞科技汇

16进制如何转Java string?

  1. 将 16 进制格式的 String 转换回原始的文本 String"48656C6C6F" 转换为 "Hello")。
  2. 将一个字节数组 转换为 16 进制的 String 表示形式(这是 16 进制转换的“反向”操作,但经常被一起讨论)。

下面我将详细讲解这两种情况,并提供最常用和推荐的方法。

16进制如何转Java string?-图1
(图片来源网络,侵删)

将 16 进制字符串转换为文本字符串

这是最直接的情况,比如你有一个 16 进制编码的字符串,想把它解码成人类可读的文本。

方法 1:使用 javax.xml.bind.DatatypeConverter (最简单)

这是最简单、最直接的方法,不需要任何第三方库,它适用于 Java 6, 7, 8, 9, 10, 11,从 Java 9 开始,它被移到了 java.xml.bind 模块中,需要手动引入。

代码示例 (Java 8 及更早版本,无需额外操作):

public class HexToString {
    public static void main(String[] args) {
        // 一个表示 "Hello World" 的 16 进制字符串
        String hexString = "48656C6C6F20576F726C64";
        // 使用 DatatypeDecoder 将 16 进制字符串解码为字节数组
        byte[] bytes = DatatypeConverter.parseHexBinary(hexString);
        // 使用 String 的构造函数将字节数组转换为 String
        // "UTF-8" 是一种常用的字符编码,必须与编码时使用的编码一致!
        String result = new String(bytes, "UTF-8");
        System.out.println("原始 16 进制字符串: " + hexString);
        System.out.println("转换后的文本字符串: " + result); // 输出: Hello World
    }
}

代码示例 (Java 9 及更高版本,需要添加模块声明):

16进制如何转Java string?-图2
(图片来源网络,侵删)

如果你使用的是 Java 9 或更高版本,并且遇到 DatatypeConverter 找不到的问题,需要在 module-info.java 文件中添加 java.xml.bind 模块:

// module-info.java
module your.module.name {
    requires java.xml.bind;
}

方法 2:使用 Apache Commons Codec (推荐)

如果你已经在使用 Apache Commons 库,或者希望代码更具可移植性(不依赖 Java 内部 API),这是最好的选择。

添加依赖:

如果你使用 Maven,在 pom.xml 中添加:

16进制如何转Java string?-图3
(图片来源网络,侵删)
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version> <!-- 使用最新版本 -->
</dependency>

如果你使用 Gradle,在 build.gradle 中添加:

implementation 'commons-codec:commons-codec:1.15' // 使用最新版本

代码示例:

import org.apache.commons.codec.binary.Hex;
public class HexToStringApache {
    public static void main(String[] args) {
        String hexString = "48656C6C6F20576F726C64";
        // Hex.decodeHex() 方法直接返回字节数组
        byte[] bytes = Hex.decodeHex(hexString.toCharArray());
        // 将字节数组转换为 String
        String result = new String(bytes, "UTF-8");
        System.out.println("原始 16 进制字符串: " + hexString);
        System.out.println("转换后的文本字符串: " + result); // 输出: Hello World
    }
}

将字节数组转换为 16 进制字符串

这是“16 进制转 string”更常见的含义,即把二进制数据(如文件内容、哈希值)用 16 进制字符表示出来。

方法 1:使用 javax.xml.bind.DatatypeConverter (最简单)

和上面一样,这个类也提供了非常方便的方法。

代码示例:

import javax.xml.bind.DatatypeConverter;
public class BytesToHex {
    public static void main(String[] args) {
        String text = "Hello";
        byte[] bytes = text.getBytes(); // 默认使用平台编码,最好明确指定
        // 使用 DatatypeConverter 将字节数组转换为 16 进制字符串
        String hexString = DatatypeConverter.printHexBinary(bytes);
        System.out.println("原始文本: " + text);
        System.out.println("字节数组: " + java.util.Arrays.toString(bytes));
        System.out.println("16 进制字符串: " + hexString); // 输出: 48656C6C6F
    }
}

方法 2:使用 Apache Commons Codec (推荐)

同样,如果你使用 Apache Commons Codec,代码也非常简洁。

代码示例:

import org.apache.commons.codec.binary.Hex;
public class BytesToHexApache {
    public static void main(String[] args) {
        String text = "Hello";
        byte[] bytes = text.getBytes();
        // Hex.encodeHexString() 方法直接返回 16 进制字符串
        String hexString = Hex.encodeHexString(bytes);
        System.out.println("原始文本: " + text);
        System.out.println("字节数组: " + java.util.Arrays.toString(bytes));
        System.out.println("16 进制字符串: " + hexString); // 输出: 48656C6C6F
    }
}

总结与推荐

操作 推荐方法 优点 缺点
Hex -> String DatatypeConverter 无需外部库,一行代码搞定 Java 9+ 需要手动添加模块
Apache Commons Codec 代码清晰,跨版本兼容性好,功能强大 需要引入第三方依赖
Bytes -> Hex DatatypeConverter 无需外部库,一行代码搞定 Java 9+ 需要手动添加模块
Apache Commons Codec 代码清晰,跨版本兼容性好,功能强大 需要引入第三方依赖

核心要点:

  1. 编码是关键: 在 byte[]String 之间转换时,必须指定字符编码(如 "UTF-8"),如果编码和解码时使用的编码不一致,就会出现乱码,在 Java 中,强烈推荐始终使用 StandardCharsets.UTF_8,它比字符串字面量更安全。
    // 推荐写法
    String result = new String(bytes, StandardCharsets.UTF_8);
    byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
  2. 选择方法:
    • 如果你的项目已经依赖了 Apache Commons,或者你希望代码不依赖 Java 内部模块,使用 Apache Commons Codec 是最稳妥、最现代的选择
    • 如果你只是想快速写一个简单的工具,且不介意 Java 版本问题,DatatypeConverter 是最快的选择

希望这个详细的解释能帮助你!

分享:
扫描分享到社交APP
上一篇
下一篇