private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
До этого момента ... просто базовая настройка и запуск цикла для прохождения всех байтов в массиве
int halfbyte = (data[i] >>> 4) & 0x0F;
байта при преобразовании в шестнадцатеричный формат - это две шестнадцатеричные цифры или 8 двоичных цифр, в зависимости от того, на какой базе вы смотрите на них. Вышеприведенный оператор сдвигает старшие 4 бита вниз (>>> - беззнаковое смещение вправо) и логически возвращает И с помощью 0000 1111, так что результатом является целое число, равное старшим 4 битам байта (первая шестнадцатеричная цифра).
Скажем, 23 был вход, это 0001 0111 в двоичном виде. Сдвиг делает и логическое И закрывает это до 0000 0001.
int two_halfs = 0;
do {
Это просто настраивает цикл do / while для запуска дважды
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append((char) ('0' + halfbyte));
else
buf.append((char) ('a' + (halfbyte - 10)));
Здесь мы показываем фактическую шестнадцатеричную цифру, в основном просто используя ноль или символ в качестве начальной точки и перемещаясь к правильному символу. Первый оператор if охватывает все цифры 0-9, а второй - все цифры 10-15 (a-f в шестнадцатеричном формате)
Опять же, в нашем примере 0000 0001 в десятичном формате равен 1. Мы попадаем в верхний блок if и добавляем 1 к символу '0', чтобы получить символ '1', добавляем его в строку и продолжаем .
halfbyte = data[i] & 0x0F;
Теперь мы установили целое число так, чтобы оно равнялось младшим битам байта, и повторяем.
Опять же, если наш вход был 23 ... 0001 0111 после логического И становится просто 0000 0111, который является 7 в десятичном виде. Повторите ту же логику, что и выше, и появится символ «7».
} while(two_halfs++ < 1);
Теперь мы просто переходим к следующему байту в массиве и повторяем.
}
return buf.toString();
}
Чтобы ответить на ваш следующий вопрос, Java API уже имеет базовую утилиту преобразования, встроенную в BigInteger. См. Документацию toString (int radix) .
Не зная реализации, используемой Java API, я не могу сказать наверняка, но я готов поспорить, что расширение Java более эффективно, чем первый несколько простой алгоритм, который вы опубликовали.