我有一个用十六进制数字填充的字节数组,用简单的方法打印它是毫无意义的,因为有很多不可打印的元素。我需要的是以下形式的确切十六进制代码:3a5f771c
最佳答案
从讨论 here ,尤其是 this 答案,这是我目前使用的功能:
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);
}
关于java - 如何在 Java 中将字节数组转换为十六进制字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9655181/