2013-10-18 18 views
7

So che è possibile utilizzare printf e utilizzare anche StringBuilder.append(String.format("%x", byte)) per convertire valori in valori HEX e visualizzarli sulla console. Ma voglio essere in grado di formattare effettivamente l'array di byte in modo che ogni byte sia visualizzato come HEX anziché decimale.Come convertire l'array di byte in formato esadecimale in Java

Qui è una sezione del mio codice che ho già che fa le prime due modi che ho affermato:

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 stringa che è stata suddivisa in di byte era:

"1E2021345A2B" 

ma visualizza come decimale sulla console come:

"303233529043" 

qualcuno potrebbe aiutarmi su come ottenere i valori effettivi in ​​esadecimale e visualizzarli in questo modo in modo naturale. Grazie in anticipo.

+0

Perché non basta chiamare Integer.parseInt (sb.ToString(), 16)? – Luke

risposta

4

Il modo in cui lo faccio:

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); 
    } 
+0

Voglio ancora restituire un array di byte anche se ogni byte è stato formattato in hex. per esempio. la stringa era 1E e il byte ora è 30 in decimale e voglio che il byte sia formattato su 1E. C'è un modo per farlo? –

+0

Richiede due caratteri HEX per 'descrivere' 1 byte. Puoi rappresentare 1 carattere esadecimale usando 1 byte, se codifichi il carattere esadecimale usando il codice ASCII del hex chrar. Quindi, hai bisogno di due byte per descrivere un byte in esadecimale, in ASCII. Non sono sicuro di cosa tu voglia veramente. – Tamas

+0

Voglio avere due caratteri che occupano 1 singolo byte. Quindi, per il mio esempio, ho un array di byte di 6. –

22

È possibile utilizzare il String javax.xml.bind.DatatypeConverter.printHexBinary(byte[]). es .:

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

Sto usando Android Java e Android non supporta questo. C'è un altro modo per aggirare questo? –

+2

Il modo più breve di qualsiasi altro modo che ho trovato. – Alex

+0

La risposta di VGR funziona anche su Android ed è molto più semplice. – Ethan

16

String.format fa effettivamente uso della classe java.util.Formatter. Invece di utilizzare il metodo comodo String.Format, utilizzare un formattatore direttamente:

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

Questa è la risposta più breve e più semplice a questa domanda che ho potuto trovare e che non si basa su librerie non standard. Davvero eccellente!!! – Ethan

-1

Prova questa

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