如何在 Java 中将字节数组转换为十六进制字符串?

新手上路,请多包涵

我有一个用十六进制数字填充的字节数组,用简单的方法打印它是毫无意义的,因为有很多不可打印的元素。我需要的是以下形式的确切十六进制代码: 3a5f771c

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

阅读 752
2 个回答

这里 的讨论,尤其是 这个 答案,这是我目前使用的功能:

 private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = HEX_ARRAY[v >>> 4];
        hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
    }
    return new String(hexChars);
}

我自己的小型基准测试(一千次一百万字节,一千万次 256 字节)表明它比任何其他替代方案都要快得多,大约是长数组的一半时间。与我从中得到的答案相比,切换到按位运算——正如讨论中所建议的——将长数组的时间缩短了 20%。 (编辑:当我说它比替代方案更快时,我的意思是讨论中提供的替代代码。性能相当于 Commons Codec,它使用非常相似的代码。)

2k20 版本,关于 Java 9 紧凑字符串:

 private static final byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII);
public static String bytesToHex(byte[] bytes) {
    byte[] hexChars = new byte[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = HEX_ARRAY[v >>> 4];
        hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
    }
    return new String(hexChars, StandardCharsets.UTF_8);
}

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

Apache Commons Codec 库有一个 Hex 类来完成这种类型的工作。

 import org.apache.commons.codec.binary.Hex;

String foo = "I am a string";
byte[] bytes = foo.getBytes();
System.out.println( Hex.encodeHexString( bytes ) );

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

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