Как преобразовать байтовый массив в шестнадцатеричную строку в Java?
650
У меня есть байтовый массив, заполненный шестнадцатеричными числами, и печатать его простым способом довольно бессмысленно, потому что там много непечатаемых элементов. Мне нужен точный шестнадцатеричный код в виде:3a5f771c
Почему бы просто не попробовать сначала и показать нам, что у вас есть. Тебе нечего терять и все получать. Integer имеет toHexString(...)метод, который может помочь, если это то, что вы ищете. Также String.format(...)можно сделать несколько простых трюков форматирования с использованием %2xстроки кода.
«Мне нужен точный шестнадцатеричный код в виде: 3a5f771c ...» - вы запросили точную форму, но не предоставили точного примера. Продолжая то, что вы предоставили, преобразуйте первые четыре байта в строку, затем объедините эллипсы в строку.
jww
1
С помощью потока в Java 8 это может быть просто реализовано как: static String byteArrayToHex (byte [] a) {return IntStream.range (0, a.length) .mapToObj (i -> String.format ("% 02x ", a [i])) .reduce ((acc, v) -> acc +" "+ v) .get (); }
Тибетти
Ответы:
902
Из обсуждения здесь , и особенно из этого ответа, я использую эту функцию:
Мои собственные крошечные тесты (миллион байтов в тысячу раз, 256 байтов в 10 миллионов раз) показали, что он намного быстрее, чем любая другая альтернатива, примерно вдвое меньше для длинных массивов. По сравнению с ответом, который я получил, переключение на побитовые операции - как предложено в обсуждении - сократило время на длинные массивы примерно на 20%. (Изменить: когда я говорю, что это быстрее, чем альтернативы, я имею в виду альтернативный код, предложенный в обсуждениях. Производительность эквивалентна кодеку Commons, который использует очень похожий код.)
Версия 2k20, относительно компактных строк Java 9:
Я только что нашел javax.xml.bind.DataTypeConverter , часть стандартного дистрибутива. Почему это не возникает, когда вы Google такие проблемы? Много полезных инструментов, в том числе String printHexBinary(byte[])и byte[] parseHexBinary(String). printHexBinaryоднако намного (в 2 раза) медленнее, чем функция в этом ответе. (Я проверил источник; он использует stringBuilder. parseHexBinaryИспользует массив.) Правда, для большинства целей он достаточно быстр, и, вероятно, он у вас уже есть.
Может быть, WeSouldStealAVan
75
+1 за ответ, так как Android не имеет DataTypeConverter
Vaiden
7
@maybeWeCouldStealAVan: JDK 7 теперь с открытым исходным кодом. Мы должны представить патч для улучшения производительности для printHexBinary?
Кевинарпе
3
@maybeWeCouldStealAVan Не могли бы вы объяснить, как это работает. Я следую по большей части, но мне действительно нравится понимать, что происходит при использовании кода. Спасибо!
jjNford
24
javax.xml.bind.DataTypeConverterудаляется с Java 11.
@cytinus - мое понижение произошло 4 месяца назад, поэтому я не совсем уверен, о чем я думал, но я, вероятно, возражал против размера библиотеки. Это небольшая функция в программе; нет необходимости добавлять такую громоздкую библиотеку в проект для ее выполнения.
ArtOfWarfare
6
@ArtOfWarefare Я согласен, поэтому вместо import org.apache.commons.codec.*;вас можно было бы сделатьimport org.apache.commons.codec.binary.Hex;
cytinus
12
@ArtOfWarfare Я должен не согласиться. Единственное, что ужасно, это то, что библиотеки Apache Commons по умолчанию не включены в JRE и JDK. Есть несколько библиотек, которые настолько полезны, что по умолчанию они должны быть в вашем пути к классам, и это одна из них.
CorsiKa
29
Я настоятельно рекомендую этот ответ поменять местами как верхний ответ. Всегда голосуйте, чтобы использовать хорошо протестированную, производительную библиотеку с открытым исходным кодом над пользовательским кодом, который не улучшается.
Дмитрий Лихтен
6
Или, если вы используете BouncyCastle (org.bouncycastle : bcprov-jdk15on ), вы можете использовать этот класс:, org.bouncycastle.util.encoders.Hexс этим методом:String toHexString(byte[] data)
В Java 8 и более ранних версиях JAXB был частью стандартной библиотеки Java. Это было объявлено устаревшим с Java 9 и удалено с Java 11 , как часть попытки переместить все пакеты Java EE в свои собственные библиотеки. Это длинная история . Теперь javax.xml.bindего не существует, и если вы хотите использовать JAXB, который содержит DatatypeConverter, вам нужно установить JAXB API и JAXB Runtime от Maven.
Хорошее решение, хотя, к сожалению, оно не подходит для Android.
Казрико
@Kazriko, может быть, вы хотите прочитать code.google.com/p/dalvik/wiki/JavaxPackages . Это способ получить классы JavaScript в Android. Но если вы хотите конвертировать только в гекс, это не стоит проблем.
PhoneixS
13
DatatypeConverter больше не доступен с JDK 9
pmcollins
3
@PhoneixS Это все еще там, но не является частью времени выполнения по умолчанию (из-за модулей Java 9).
центре внимания
2
не полагайтесь на javax.xml.bind, он прекрасно компилируется, но его нельзя найти во время выполнения. если вы это сделаете, будьте готовы обработать java.lang.NoClassDefFoundError
Дмитрий
227
Самое простое решение, без внешних библиотек, без констант цифр:
Это очень медленно, в среднем в 1000 раз медленнее (для длины 162 байта), чем в верхнем ответе. Избегайте использования String.Format, если производительность имеет значение.
pt123
8
Может быть, медленно. Это хорошо для вещей, происходящих время от времени, таких как логин или подобное.
Указатель нулевой
29
Если это медленно, и что? В моем случае это просто для оператора отладки, так что спасибо за этот фрагмент кода.
Викингстев
8
Повторное использование библиотеки путем добавления дополнительных JAR-файлов размером в несколько десятков килобайт будет неэффективным, если вам нужна только эта функция (на некоторых платформах, таких как Android, весь Jar-файл включается в конечное приложение). И иногда более короткий и понятный код лучше, когда производительность не требуется.
personne3000
2
@ personne3000, может быть, но в этом случае вам нужна поддержка потока, а не функция единого вызова. это легко понять и запомнить, и, следовательно, поддерживать.
В Гуаве вы также можете использовать new HashCode(bytes).toString().
mfulton26
1
По состоянию на Гуава 22,0 этоHashCode.fromBytes(checksum).toString()
Devstr
43
Этот простой oneliner работает для меня String result = new BigInteger(1, inputBytes).toString(16);
РЕДАКТИРОВАТЬ - Использование этого удалит ведущие нули, но они сработали для моего варианта использования. Спасибо @Voicu за указание на это
@Voicu ... И это добавит начальный ноль в 50% случаев.
Maarten Bodewes
27
Вот несколько общих опций, упорядоченных от простого (однострочный) до сложного (огромная библиотека). Если вы заинтересованы в производительности, см. Микро тесты ниже.
Вариант 1: фрагмент кода - простой
Одним из очень простых решений является использование BigIntegerшестнадцатеричного представления:
newBigInteger(1, someByteArray).toString(16)
Обратите внимание, что, поскольку он обрабатывает числа, а не произвольные строки байтов, он пропускает ведущие нули - это может или не может быть тем, что вы хотите (например, 000AE3против 0AE33-байтового ввода). Это также очень медленно, примерно в 100 раз медленнее по сравнению со следующим вариантом.
Вариант 2: фрагмент кода - расширенный
Вот полнофункциональный, копируемый и вставляемый фрагмент кода, поддерживающий верхний / нижний регистр и порядковый номер . Он оптимизирован для минимизации сложности памяти и максимизации производительности и должен быть совместим со всеми современными версиями Java (5+).
privatestaticfinalchar[] LOOKUP_TABLE_LOWER =newchar[]{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x66};privatestaticfinalchar[] LOOKUP_TABLE_UPPER =newchar[]{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};publicstaticString encode(byte[] byteArray,boolean upperCase,ByteOrder byteOrder){// our output size will be exactly 2x byte-array lengthfinalchar[] buffer =newchar[byteArray.length *2];// choose lower or uppercase lookup tablefinalchar[] lookup = upperCase ? LOOKUP_TABLE_UPPER : LOOKUP_TABLE_LOWER;int index;for(int i =0; i < byteArray.length; i++){// for little endian we count from last to first
index =(byteOrder ==ByteOrder.BIG_ENDIAN)? i : byteArray.length - i -1;// extract the upper 4 bit and look up char (0-A)
buffer[i <<1]= lookup[(byteArray[index]>>4)&0xF];// extract the lower 4 bit and look up char (0-A)
buffer[(i <<1)+1]= lookup[(byteArray[index]&0xF)];}returnnewString(buffer);}publicstaticString encode(byte[] byteArray){return encode(byteArray,false,ByteOrder.BIG_ENDIAN);}
Полный исходный код с лицензией Apache v2 и декодером можно найти здесь .
Вариант 3. Использование небольшой оптимизированной библиотеки: bytes-java
Работая над моим предыдущим проектом, я создал этот небольшой инструментарий для работы с байтами в Java. Он не имеет внешних зависимостей и совместим с Java 7+. Он включает, среди прочего, очень быстрый и хорошо протестированный HEX en / decoder:
Конечно, есть хорошие кодеки . ( предупреждающее мнение впереди ) Во время работы над проектом, описанным выше, я проанализировал код и был весьма разочарован; множество дублированных неорганизованных кодов, устаревших и экзотических кодеков, вероятно, полезно только для очень немногих и довольно изощренных и медленных реализаций популярных кодеков (особенно Base64). Поэтому я бы принял обоснованное решение, если вы хотите использовать его или альтернативу. В любом случае, если вы все еще хотите его использовать, вот фрагмент кода:
Вариант 8 не совсем: совместимость с Java 9+ или «Не используйте JAXBs javax / xml / bind / DatatypeConverter»
В предыдущих версиях Java (8 и ниже) код Java для JAXB был включен как зависимость времени выполнения. Начиная с Java 9 и Jigsaw modularisation ваш код не может получить доступ к другому коду вне своего модуля без явного объявления. Так что будьте внимательны, если вы получите исключение, подобное:
при работе на JVM с Java 9+. Если это так, то переключите реализации на любую из альтернатив, описанных выше. Смотрите также этот вопрос .
Микро Тесты
Ниже приведены результаты простого JMH микро эталонного кодирование байтовых массивов различных размеров . Значения - это операции в секунду, поэтому чем выше , тем лучше.
Обратите внимание, что микропроцессоры очень часто не отражают поведение в реальном мире, поэтому воспринимайте эти результаты с недоверием.
|Name(ops/s)|16byte|32byte|128byte|0.95 MB ||----------------------|-----------:|-----------:|----------:|--------:||Opt1:BigInteger|2,088,514|1,008,357|133,665|4||Opt2/3:BytesLib|20,423,170|16,049,841|6,685,522|825||Opt4:ApacheCommons|17,503,857|12,382,018|4,319,898|529||Opt5:Guava|10,177,925|6,937,833|2,094,658|257||Opt6:Spring|18,704,986|13,643,374|4,904,805|601||Opt7: BC |7,501,666|3,674,422|1,077,236|152||Opt8: JAX-B |13,497,736|8,312,834|2,590,940|346|
Спецификации: JDK 8u202, i7-7700K, Win10, 24 ГБ RAM. Смотрите полный тест здесь .
Самым элегантным, как он также отмечает, я думаю, является этот:
staticfinalString HEXES ="0123456789ABCDEF";publicstaticString getHex(byte[] raw ){if( raw ==null){returnnull;}finalStringBuilder hex =newStringBuilder(2* raw.length );for(finalbyte b : raw ){
hex.append(HEXES.charAt((b &0xF0)>>4)).append(HEXES.charAt((b &0x0F)));}return hex.toString();}
Другие методы выполнялись на моей 64-байтовой выборке за 5 мс, этот работает за 0 мс. Вероятно, лучше всего из-за отсутствия каких-либо других строковых функций, таких как формат.
Джозеф Ласт
if (raw == null) return nullне подведет быстро. Зачем тебе когда-нибудь использовать nullключ?
Maarten Bodewes
Я полагаю, это привычка вводить подтверждение. В этом случае мы предотвращаем любое исключение ссылки Null и оставляем вызывающей стороне обрабатывать неверные данные.
Майкл Бисбьерг
16
При незначительной стоимости хранения таблицы соответствия эта реализация проста и очень быстра.
Почему бы не инициализировать BYTE2HEXмассив простым forциклом?
icza
@icza Возможно ли это даже с помощью поля static final (aka constant)?
Невелис
1
@nevelis Может быть назначен в static { }блоке.
よ ル ち ゃ ん だ よ
1
@icza, потому что быстрее жестко кодировать таблицу поиска, чем генерировать ее. Здесь сложность памяти торгуется со сложностью времени, т.е. нужно больше памяти, но быстрее (чуть-чуть с обоих концов)
Патрик Фавр
8
Как насчет этого?
String byteToHex(finalbyte[] hash){Formatter formatter =newFormatter();for(byte b : hash){
formatter.format("%02x", b);}String result = formatter.toString();
formatter.close();return result;}
Это несколько более гибкая адаптация принятого ответа. Лично я сохраняю принятый ответ и эту перегрузку вместе с ним, чтобы его можно было использовать в более широком контексте.
Если debuffer имеет плохой день, попробуйте cluing в StringBuilder конкретизации с количеством символов для поддержки: StringBuilder buf = new StringBuilder(data.length * 2);.
седобородый
2
Итак, есть несколько способов сделать это, но если вы решите использовать библиотеку, я бы посоветовал поискать в вашем проекте, чтобы увидеть, было ли что-то реализовано в библиотеке, которая уже является частью вашего проекта, прежде чем добавлять новую библиотеку просто чтобы сделать это. Например, если у вас еще нет
Добавление утилиты jar для простой функции не является хорошим вариантом. Вместо этого соберите свои собственные служебные классы. Следующее возможно быстрее реализации.
На этой странице не найдено ни одного решения, которое бы не
Используйте цикл
Используйте javax.xml.bind.DatatypeConverter, который прекрасно компилируется, но часто выдает java.lang.NoClassDefFoundError во время выполнения.
Вот решение, в котором нет недостатков, указанных выше (хотя никаких обещаний у меня нет и других недостатков)
import java.math.BigInteger;importstatic java.lang.System.out;publicfinalclassApp2{// | proposed solution.publicstaticString encode(byte[] bytes){finalint length = bytes.length;// | BigInteger constructor throws if it is given an empty array.if(length ==0){return"00";}finalint evenLength =(int)(2*Math.ceil(length /2.0));finalString format ="%0"+ evenLength +"x";finalString result =String.format (format,newBigInteger(bytes));return result;}publicstaticvoid main(String[] args)throwsException{// 00
out.println(encode(newbyte[]{}));// 01
out.println(encode(newbyte[]{1}));//203040
out.println(encode(newbyte[]{0x20,0x30,0x40}));// 416c6c20796f75722062617365206172652062656c6f6e6720746f2075732e
out.println(encode("All your base are belong to us.".getBytes()));}}
Я не мог получить это под 62 кодами операций, но если вы можете жить без заполнения 0 в случае, если первый байт меньше 0x10, то в следующем решении используются только 23 кода операции. Действительно показывает, как «легко реализовать себя» решения, такие как «pad с нулем, если длина строки нечетна», могут стать довольно дорогими, если собственная реализация еще не доступна (или в этом случае, если BigInteger имел возможность ставить префикс с нулями в нанизывать).
publicstaticString encode(byte[] bytes){finalint length = bytes.length;// | BigInteger constructor throws if it is given an empty array.if(length ==0){return"00";}returnnewBigInteger(bytes).toString(16);}
Мое решение основано на решении может быть WeCouldStealAVan, но не опирается на какие-либо дополнительные таблицы поиска. Он не использует хаки типа int-to-char (на самом деле, Character.forDigit()делает это, выполняя некоторое сравнение, чтобы проверить, что на самом деле является цифрой) и, следовательно, может быть немного медленнее. Пожалуйста, не стесняйтесь использовать его где угодно. Приветствия.
publicstaticString bytesToHex(finalbyte[] bytes){finalint numBytes = bytes.length;finalchar[] container =newchar[numBytes *2];for(int i =0; i < numBytes; i++){finalint b = bytes[i]&0xFF;
container[i *2]=Character.forDigit(b >>>4,0x10);
container[i *2+1]=Character.forDigit(b &0xF,0x10);}returnnewString(container);}
publicstaticbyte[] hexStringToByteArray(String s){int len = s.length();byte[] data =newbyte[len /2];for(int i =0; i < len; i +=2){
data[i /2]=(byte)((Character.digit(s.charAt(i),16)<<4)+Character.digit(s.charAt(i+1),16));}return data;}
privatestaticString bytesToHexString(byte[] bytes,int length){if(bytes ==null|| length ==0)returnnull;StringBuilder ret =newStringBuilder(2*length);for(int i =0; i < length ; i++){int b;
b =0x0f&(bytes[i]>>4);
ret.append("0123456789abcdef".charAt(b));
b =0x0f& bytes[i];
ret.append("0123456789abcdef".charAt(b));}return ret.toString();}
toHexString(...)
метод, который может помочь, если это то, что вы ищете. ТакжеString.format(...)
можно сделать несколько простых трюков форматирования с использованием%2x
строки кода.Ответы:
Из обсуждения здесь , и особенно из этого ответа, я использую эту функцию:
Мои собственные крошечные тесты (миллион байтов в тысячу раз, 256 байтов в 10 миллионов раз) показали, что он намного быстрее, чем любая другая альтернатива, примерно вдвое меньше для длинных массивов. По сравнению с ответом, который я получил, переключение на побитовые операции - как предложено в обсуждении - сократило время на длинные массивы примерно на 20%. (Изменить: когда я говорю, что это быстрее, чем альтернативы, я имею в виду альтернативный код, предложенный в обсуждениях. Производительность эквивалентна кодеку Commons, который использует очень похожий код.)
Версия 2k20, относительно компактных строк Java 9:
источник
String printHexBinary(byte[])
иbyte[] parseHexBinary(String)
.printHexBinary
однако намного (в 2 раза) медленнее, чем функция в этом ответе. (Я проверил источник; он используетstringBuilder
.parseHexBinary
Использует массив.) Правда, для большинства целей он достаточно быстр, и, вероятно, он у вас уже есть.printHexBinary
?javax.xml.bind.DataTypeConverter
удаляется с Java 11.В библиотеке кодеков Apache Commons есть класс Hex для выполнения именно этого типа работы.
источник
import org.apache.commons.codec.*;
вас можно было бы сделатьimport org.apache.commons.codec.binary.Hex;
org.bouncycastle.util.encoders.Hex
с этим методом:String toHexString(byte[] data)
Метод
javax.xml.bind.DatatypeConverter.printHexBinary()
, являющийся частью архитектуры Java для привязки XML (JAXB) , был удобным способом преобразованияbyte[]
строки в шестнадцатеричную.DatatypeConverter
Класс также включает множество других полезных методов данных манипуляций.В Java 8 и более ранних версиях JAXB был частью стандартной библиотеки Java. Это было объявлено устаревшим с Java 9 и удалено с Java 11 , как часть попытки переместить все пакеты Java EE в свои собственные библиотеки. Это длинная история . Теперь
javax.xml.bind
его не существует, и если вы хотите использовать JAXB, который содержитDatatypeConverter
, вам нужно установить JAXB API и JAXB Runtime от Maven.Пример использования:
Приведет к:
Этот ответ такой же, как этот .
источник
Самое простое решение, без внешних библиотек, без констант цифр:
источник
Решение Guava, для полноты:
Сейчас
hex
есть"48656c6c6f20776f726c64"
.источник
new HashCode(bytes).toString()
.HashCode.fromBytes(checksum).toString()
Этот простой oneliner работает для меня
String result = new BigInteger(1, inputBytes).toString(16);
РЕДАКТИРОВАТЬ - Использование этого удалит ведущие нули, но они сработали для моего варианта использования. Спасибо @Voicu за указание на это
источник
Вот несколько общих опций, упорядоченных от простого (однострочный) до сложного (огромная библиотека). Если вы заинтересованы в производительности, см. Микро тесты ниже.
Вариант 1: фрагмент кода - простой
Одним из очень простых решений является использование
BigInteger
шестнадцатеричного представления:Обратите внимание, что, поскольку он обрабатывает числа, а не произвольные строки байтов, он пропускает ведущие нули - это может или не может быть тем, что вы хотите (например,
000AE3
против0AE3
3-байтового ввода). Это также очень медленно, примерно в 100 раз медленнее по сравнению со следующим вариантом.Вариант 2: фрагмент кода - расширенный
Вот полнофункциональный, копируемый и вставляемый фрагмент кода, поддерживающий верхний / нижний регистр и порядковый номер . Он оптимизирован для минимизации сложности памяти и максимизации производительности и должен быть совместим со всеми современными версиями Java (5+).
Полный исходный код с лицензией Apache v2 и декодером можно найти здесь .
Вариант 3. Использование небольшой оптимизированной библиотеки: bytes-java
Работая над моим предыдущим проектом, я создал этот небольшой инструментарий для работы с байтами в Java. Он не имеет внешних зависимостей и совместим с Java 7+. Он включает, среди прочего, очень быстрый и хорошо протестированный HEX en / decoder:
Вы можете проверить это на Github: bytes-java .
Вариант 4: Кодек Apache Commons
Конечно, есть хорошие кодеки . ( предупреждающее мнение впереди ) Во время работы над проектом, описанным выше, я проанализировал код и был весьма разочарован; множество дублированных неорганизованных кодов, устаревших и экзотических кодеков, вероятно, полезно только для очень немногих и довольно изощренных и медленных реализаций популярных кодеков (особенно Base64). Поэтому я бы принял обоснованное решение, если вы хотите использовать его или альтернативу. В любом случае, если вы все еще хотите его использовать, вот фрагмент кода:
Вариант 5: Google Guava
Чаще всего у вас уже есть Guava в качестве зависимости. Если это так, просто используйте:
Вариант 6: Spring Security
Если вы используете Spring Framework с Spring Security, вы можете использовать следующее:
Вариант 7: Надувной замок
Если вы уже используете инфраструктуру безопасности Bouncy Castle, вы можете использовать ее
Hex
утилиту:Вариант 8 не совсем: совместимость с Java 9+ или «Не используйте JAXBs javax / xml / bind / DatatypeConverter»
В предыдущих версиях Java (8 и ниже) код Java для JAXB был включен как зависимость времени выполнения. Начиная с Java 9 и Jigsaw modularisation ваш код не может получить доступ к другому коду вне своего модуля без явного объявления. Так что будьте внимательны, если вы получите исключение, подобное:
при работе на JVM с Java 9+. Если это так, то переключите реализации на любую из альтернатив, описанных выше. Смотрите также этот вопрос .
Микро Тесты
Ниже приведены результаты простого JMH микро эталонного кодирование байтовых массивов различных размеров . Значения - это операции в секунду, поэтому чем выше , тем лучше. Обратите внимание, что микропроцессоры очень часто не отражают поведение в реальном мире, поэтому воспринимайте эти результаты с недоверием.
Спецификации: JDK 8u202, i7-7700K, Win10, 24 ГБ RAM. Смотрите полный тест здесь .
источник
Используйте класс DataTypeConverter
javax.xml.bind.DataTypeConverter
String hexString = DatatypeConverter.printHexBinary(bytes[] raw);
источник
Я бы использовал что-то вроде этого для фиксированной длины, например, хэши:
источник
Я нашел три разных способа здесь: http://www.rgagnon.com/javadetails/java-0596.html
Самым элегантным, как он также отмечает, я думаю, является этот:
источник
if (raw == null) return null
не подведет быстро. Зачем тебе когда-нибудь использоватьnull
ключ?При незначительной стоимости хранения таблицы соответствия эта реализация проста и очень быстра.
источник
BYTE2HEX
массив простымfor
циклом?static { }
блоке.Как насчет этого?
источник
Нам не нужно использовать какую-либо внешнюю библиотеку или писать код на основе циклов и констант.
Достаточно только этого:
источник
Я предпочитаю использовать это:
Это несколько более гибкая адаптация принятого ответа. Лично я сохраняю принятый ответ и эту перегрузку вместе с ним, чтобы его можно было использовать в более широком контексте.
источник
Я обычно использую следующий метод для заявления debuf, но я не знаю, является ли это лучшим способом сделать это или нет
источник
StringBuilder buf = new StringBuilder(data.length * 2);
.Итак, есть несколько способов сделать это, но если вы решите использовать библиотеку, я бы посоветовал поискать в вашем проекте, чтобы увидеть, было ли что-то реализовано в библиотеке, которая уже является частью вашего проекта, прежде чем добавлять новую библиотеку просто чтобы сделать это. Например, если у вас еще нет
может быть, у вас есть ...
источник
Если вы используете платформу Spring Security, вы можете использовать:
источник
Добавление утилиты jar для простой функции не является хорошим вариантом. Вместо этого соберите свои собственные служебные классы. Следующее возможно быстрее реализации.
источник
Небольшой вариант решения, предложенного @maybewecouldstealavan, который позволяет визуально объединять N байтов в выходную шестнадцатеричную строку:
Это:
источник
На этой странице не найдено ни одного решения, которое бы не
Вот решение, в котором нет недостатков, указанных выше (хотя никаких обещаний у меня нет и других недостатков)
Я не мог получить это под 62 кодами операций, но если вы можете жить без заполнения 0 в случае, если первый байт меньше 0x10, то в следующем решении используются только 23 кода операции. Действительно показывает, как «легко реализовать себя» решения, такие как «pad с нулем, если длина строки нечетна», могут стать довольно дорогими, если собственная реализация еще не доступна (или в этом случае, если BigInteger имел возможность ставить префикс с нулями в нанизывать).
источник
Мое решение основано на решении может быть WeCouldStealAVan, но не опирается на какие-либо дополнительные таблицы поиска. Он не использует хаки типа int-to-char (на самом деле,
Character.forDigit()
делает это, выполняя некоторое сравнение, чтобы проверить, что на самом деле является цифрой) и, следовательно, может быть немного медленнее. Пожалуйста, не стесняйтесь использовать его где угодно. Приветствия.источник
// Сдвиг байтов более эффективен // Вы тоже можете использовать этот
источник
Если вы ищете такой же байтовый массив для python, я преобразовал эту реализацию Java в python.
источник
источник
Вот такая
java.util.Base64
реализация (частичная), не правда ли?источник
источник
источник