2013-10-18 56 views
7

我知道您可以使用printf並使用StringBuilder.append(String.format("%x", byte))將值轉換爲HEX值並在控制檯上顯示它們。但我希望能夠實際地格式化字節數組,以便每個字節顯示爲HEX而不是十進制。如何將字節數組轉換爲Java中的十六進制格式

這裏是我的代碼段,我已經是不,我說前兩種方式:

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; 

這是分裂成字節數組的字符串:

"1E2021345A2B" 

但其顯示爲十進制在控制檯上爲:

"303233529043" 

任何人都可以請幫我如何得到實際值爲十六進制並自然顯示。先謝謝你。

+0

爲什麼你不只是調用的Integer.parseInt(sb.toString(),16)? – Luke

回答

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

我仍然想要返回一個字節數組,雖然每個字節都被格式化爲十六進制。例如該字符串是1E,現在該字節是十進制的30,我希望該字節的格式返回到1E。有沒有辦法做到這一點? –

+0

它需要兩個十六進制字符'描述'1個字節。如果使用hex chrar的ASCII碼對十六進制字符進行編碼,則可以使用1個字節表示1個十六進制字符。因此,你需要兩個字節來描述一個十六進制的字節,用ASCII表示。我不確定你真正想要什麼。 – Tamas

+0

我想要兩個字符佔用1個單字節。因此,對於我的示例,我有一個6的字節數組。 –

22

可以使用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" 
} 
+1

我正在使用Android Java,Android不支持此功能。有沒有其他的方法呢? –

+2

我發現任何其他方式的最短途徑。 – Alex

+0

VGR的答案也適用於Android,它更簡單。 – Ethan

16

String.format實際上使用了java.util.Formatter類。而不是使用的String.format方便的方法,直接使用格式化:

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

這是對這個問題的最短,最簡單的答案,我已經能夠找到哪個不依賴於非標準庫。非常優秀的!!! – Ethan

-1

試試這個

byte[] raw = some_bytes; 
javax.xml.bind.DatatypeConverter.printHexBinary(raw) 
相關問題