web-dev-qa-db-fra.com

Comment convertir un tableau d'octets au format hexadécimal en Java

Je sais que vous pouvez utiliser printf et également utiliser StringBuilder.append(String.format("%x", byte)) pour convertir les valeurs en valeurs HEX et les afficher sur la console. Mais je veux être en mesure de formater le tableau d'octets afin que chaque octet soit affiché en HEX au lieu de décimal.

Voici une section de mon code que j'ai déjà qui fait les deux premières façons que j'ai déclarées:

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

        for(int i=0; i<bytes; i++)
        {
            byteString = hexSubString(hexString, offSet, CHARSPERBYTE, false); // Isolate digits for a single byte.
            Log.d("HEXSTRING", byteString);

            if(byteString.length() > 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;

La chaîne qui a été divisée en tableau d'octets était:

"1E2021345A2B"

Mais l'affiche en décimal sur la console comme:

"303233529043"

Quelqu'un pourrait-il m'aider à savoir comment obtenir les valeurs réelles en hexadécimal et les afficher de cette manière naturellement. Merci d'avance.

12
James Meade

Vous pouvez utiliser String javax.xml.bind.DatatypeConverter.printHexBinary(byte[]) . par exemple.:

public static void main(String[] args) {
    byte[] array = new byte[] { 127, 15, 0 };
    String hex = DatatypeConverter.printHexBinary(array);
    System.out.println(hex); // prints "7F0F00"
}
30
Paul Vargas

String.format utilise en fait la classe Java.util.Formatter. Au lieu d'utiliser la méthode pratique String.format, utilisez directement un formateur:

Formatter formatter = new Formatter();
for (byte b : bytes) {
    formatter.format("%02x", b);
}
String hex = formatter.toString();
23
VGR

La façon dont je le fais:

  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);
  }
4
Tamas

Essaye ça

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