使用 Java 将十六进制转储的字符串表示形式转换为字节数组?

新手上路,请多包涵

我正在寻找一种方法将表示十六进制值的长字符串(来自转储)转换为字节数组。

我没有比在 这里发布相同问题 的人更好的措辞了。

但为了保持原汁原味,我会用自己的方式表达:假设我有一个字符串 "00A0BF" 我想将其解释为

byte[] {0x00,0xA0,0xBf}

我应该怎么办?

我是 Java 新手,最终使用了 BigInteger 并注意前导十六进制零。但我认为它很丑陋,而且我确信我遗漏了一些简单的东西。

原文由 rafraf 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 600
2 个回答

更新(2021 年)- Java 17 现在包括 java.util.HexFormat (只用了 25 年):

HexFormat.of().parseHex(s)


对于旧版本的 Java:

这是我认为比目前发布的任何解决方案都更好的解决方案:

 /* s must be an even-length string. */
public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

改进的原因:

  • 使用前导零(与 BigInteger 不同)和负字节值(与 Byte.parseByte 不同)是安全的

  • 不将 String 转换为 char[] ,或为每个字节创建 StringBuilder 和 String 对象。

  • 没有可能不可用的库依赖项

随意通过 assert 添加参数检查,或者如果参数未知是安全的则例外。

原文由 Dave L. 发布,翻译遵循 CC BY-SA 4.0 许可协议

单线:

 import javax.xml.bind.DatatypeConverter;

public static String toHexString(byte[] array) {
    return DatatypeConverter.printHexBinary(array);
}

public static byte[] toByteArray(String s) {
    return DatatypeConverter.parseHexBinary(s);
}

警告

  • 在 Java 9 Jigsaw 中,这不再是(默认)java.se 根集的一部分,因此它将导致 ClassNotFoundException,除非您指定 –add-modules java.se.ee(感谢 @ eckes )
  • 在 Android 上不可用(感谢 Fabian 注意到这一点),但如果您的系统由于某种原因缺少 javax.xml ,您可以 获取源代码。感谢 @ Bert Regelink 提取源代码。

原文由 Vladislav Rastrusny 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题