我有一个字节数组,里面填充了十六进制数,用简单的方式打印它是毫无意义的,因为有很多不可打印的元素.我需要的是精确的十六进制代码,格式为:3a5f771c
我有一个字节数组,里面填充了十六进制数,用简单的方式打印它是毫无意义的,因为有很多不可打印的元素.我需要的是精确的十六进制代码,格式为: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);
}
我自己的小型基准测试(100万字节1000倍,256字节1000万倍)表明,它比任何其他替代方法都快得多,大约是长数组上的一半时间.与我给出的答案相比,切换到按位运算——正如讨论中所建议的那样——为长数组节省了大约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);
}