Вопрос по java, hex, bytearray, format, stringbuilder – Как преобразовать байтовый массив в шестнадцатеричный формат в Java

11

Я знаю, что вы можете использовать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"

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

Почему Дон'Вы просто вызываете Integer.parseInt (sb.toString (), 16)? Luke

Ваш Ответ

4   ответа
1

Попробуй это

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

Вы можете использовать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"
}
Кратчайший путь из всех других найденных мной способов. Alex
VGR»Ответ s также работает на Android инамного проще. Ethan
Лучший ответ для бизнес-приложений, где обычно доступен javax.xml.bind.DatatypeConverter JRA_TLL
Я использую Android Java, а Android нетне могу поддержать это. Есть ли другой способ обойти это? James Meade
@JamesMeade ForAndroidсмVGR»с решением. Paul Vargas
4

  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);
  }
Я хочу использовать шестнадцатеричное число в качестве представления. Не шестнадцатеричный символ из ascii, поэтому я просто хочу, чтобы он был 1E вместо 0x31 и 0x45. James Meade
Я хочу, чтобы два символа занимали один байт. Так что для моего примера у меня есть массив байтов 6. James Meade
Эти видео были очень полезны, и теперь я понимаю это лучше, спасибо. James Meade
Требуется два шестнадцатеричных символа дляописать» 1 байт Вы можете представить 1 шестнадцатеричный символ, используя 1 байт, если вы закодируете шестнадцатеричный символ, используя шестнадцатеричный кодКод ASCII. Следовательно, вам нужно два байта, чтобы описать один байт в шестнадцатеричном виде в ASCII. Я'Я не уверен, что вы действительно хотите. Tamas
21

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

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

Похожие вопросы