Из обсуждения здесь , и особенно этот ответ, это функция, которую я сейчас использую:
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 байт (10 миллионов раз) показали, что это намного быстрее, чем любая другая альтернатива, примерно вдвое меньше для длинных массивов.По сравнению с ответом, который я получил, переключение на побитовые операции - как предлагалось в обсуждении - сократило время на длинные массивы примерно на 20%.(Изменить: когда я говорю, что это быстрее, чем альтернативы, я имею в виду альтернативный код, предложенный в обсуждениях. Производительность эквивалентна кодеку Commons, который использует очень похожий код.)