Как преобразовать байтовый массив в шестнадцатеричный формат в Java

Я знаю, что вы можете использоватьprintf а также использоватьStringBuilder.append(String.format("%x", byte)) преобразовать значения в значения HEX и отобразить их на консоли. Но я хочу иметь возможность на самом деле отформатировать массив байтов так, чтобы каждый байт отображался как HEX вместо десятичного числа.

Вот раздел моего кода, который у меня уже есть, который делает первые два способа, которые я сказал:

if(bytes > 0)
    {
        byteArray = new byte[bytes]; // Set up array to receive these values.

        for(int i=0; i 0)
            {
                byteArray[i] = (byte)Integer.parseInt(byteString, 16); // Parse value into binary data array.
            }
            else
            {
                System.out.println("String is empty!");
            }

            offSet += CHARSPERBYTE; // Set up for next word hex.    
        }

        StringBuilder sb = new StringBuilder();
        for(byte b : byteArray)
        {
            sb.append(String.format("%x", b));
        }

        byte subSystem = byteArray[0];
        byte highLevel = byteArray[1];
        byte lowLevel = byteArray[2];

        System.out.println("Byte array size: " + byteArray.length);
        System.out.printf("Byte 1: " + "%x", subSystem);
        System.out.printf("Byte 2: " + "%x", highLevel);
        System.out.println("Byte 3: " + lowLevel);
        System.out.println("Byte array value: " + Arrays.toString(byteArray));
        System.out.println("Byte array values as HEX: " + sb.toString());
    }
    else
    {
        byteArray = new byte[0]; // No hex data.

        //throw new HexException();
    }

    return byteArray;

Строка, которая была разделена на массив байтов, была:

"1E2021345A2B"

Но отображает это как десятичное число на консоли как:

"303233529043"

Может ли кто-нибудь помочь мне, как получить фактические значения в шестнадцатеричном виде и отображаться таким образом, естественно. Заранее спасибо.

 Luke18 окт. 2013 г., 15:19
Почему Дон'Вы просто вызываете Integer.parseInt (sb.toString (), 16)?

Ответы на вопрос(4)

Попробуй это

byte[] raw = some_bytes;
javax.xml.bind.DatatypeConverter.printHexBinary(raw)

Вы можете использоватьString javax.xml.bind.DatatypeConverter.printHexBinary(byte[]), например.:

public static void main(String[] args) {
    byte[] array = new byte[] { 127, 15, 0 };
    String hex = DatatypeConverter.printHexBinary(array);
    System.out.println(hex); // prints "7F0F00"
}
 Paul Vargas15 мая 2017 г., 22:51
@JamesMeade ForAndroidсмVGR»с решением.
 Alex15 июл. 2014 г., 09:32
Кратчайший путь из всех других найденных мной способов.
 Ethan10 дек. 2015 г., 06:34
VGR»Ответ s также работает на Android инамного проще.
 James Meade18 окт. 2013 г., 15:21
Я использую Android Java, а Android нетне могу поддержать это. Есть ли другой способ обойти это?
 JRA_TLL16 мар. 2018 г., 15:40
Лучший ответ для бизнес-приложений, где обычно доступен javax.xml.bind.DatatypeConverter

  private static final char[] HEX_CHARS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
      'B', 'C', 'D', 'E', 'F' };

  public static String toHexString(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    int v;
    for (int j = 0; j < bytes.length; j++) {
      v = bytes[j] & 0xFF;
      hexChars[j * 2] = HEX_CHARS[v >>> 4];
      hexChars[j * 2 + 1] = HEX_CHARS[v & 0x0F];
    }
    return new String(hexChars);
  }
 Tamas18 окт. 2013 г., 15:51
Вы можете проверить это:youtube.com/watch?v=_97OwCkjh3c
 Tamas18 окт. 2013 г., 16:08
И это именно о преобразовании между системами счисления:youtube.com/watch?v=Fpm-E5v6ddc
 James Meade18 окт. 2013 г., 15:10
Я все еще хочу вернуть массив байтов, хотя каждый байт был отформатирован в шестнадцатеричный формат. например строка была 1E, а байт теперь 30 в десятичном виде, и я хочу, чтобы байт был отформатирован обратно в 1E. Есть ли способ сделать это?
 James Meade18 окт. 2013 г., 15:34
Я хочу использовать шестнадцатеричное число в качестве представления. Не шестнадцатеричный символ из ascii, поэтому я просто хочу, чтобы он был 1E вместо 0x31 и 0x45.
 James Meade18 окт. 2013 г., 16:45
Эти видео были очень полезны, и теперь я понимаю это лучше, спасибо.
 Tamas18 окт. 2013 г., 15:27
Вы должны узнать о байтах, системах счисления, символах и их кодировании в битах, которые называются 'кодировка символов', По умолчанию символ ascii кодируется с использованием 1 байта (8 бит). Шестнадцатеричная система счисления, где каждое число может начинаться с 0-F. Это число может быть представлено символом ascii. Вам нужно два шестнадцатеричных числа для описания байта (8 бит). Если вы хотите отобразить эти два числа, используя символы ascii, то вам нужно два символа и, следовательно, два байта.
 Tamas18 окт. 2013 г., 15:15
Требуется два шестнадцатеричных символа дляописать» 1 байт Вы можете представить 1 шестнадцатеричный символ, используя 1 байт, если вы закодируете шестнадцатеричный символ, используя шестнадцатеричный кодКод ASCII. Следовательно, вам нужно два байта, чтобы описать один байт в шестнадцатеричном виде в ASCII. Я'Я не уверен, что вы действительно хотите.
 Tamas18 окт. 2013 г., 15:38
0x31 и 0x45 уже шестнадцатеричные числа, их 'гекс» представление не 1E, но на самом деле31" а также "45" .
 James Meade18 окт. 2013 г., 15:45
Я знаю, что это шестнадцатеричные числа, но что такое шестнадцатеричное значение 1E, которое вызывается, когда шестнадцатеричные числа равны 31 и 45. 1 = 31, E = 45.
 Tamas18 окт. 2013 г., 15:48
'Шестнадцатеричное значение1E "» это не 'не имеет смысла так же, какдвоичное значение 010010110 ' или десятичное значение9234' Безразлично»не имеет смысла. Десятичное значение шестнадцатеричного числа '1E» равно 30. Шестнадцатеричное значение значения deciaml '30' это 1E.
 James Meade18 окт. 2013 г., 15:24
Я хочу, чтобы два символа занимали один байт. Так что для моего примера у меня есть массив байтов 6.

String.format фактически использует класс java.util.Formatter. Вместо того, чтобы использовать удобный метод String.format, используйте Formatter напрямую:

for (byte b : bytes) {
    formatter.format("%02x", b);
}
String hex = formatter.toString();
 Ethan10 дек. 2015 г., 06:34
Это самый короткий и простой ответ на этот вопрос.удалось найти то, что не зависит от нестандартных библиотек. Превосходно!!!
 Victor Queiroz07 окт. 2018 г., 02:58
Чистое решение на сегодняшний день. Спасибо! Стоит отметить, что вы можете поставитьx в верхнем регистре и добавьте пробел после него в верхнем регистре, чтобы он выглядел более читабельным

Ваш ответ на вопрос