2013-10-18 54 views
7

printf'u kullanabileceğinizi ve değerleri HEX değerlerine dönüştürmek ve konsolda görüntülemek için StringBuilder.append(String.format("%x", byte))'u kullanabileceğinizi biliyorum. Ama aslında bayt dizisini biçimlendirmek istiyorum, böylece her bayt ondalık yerine HEX olarak görüntülenir.Bayt dizisini Java'da onaltılık biçime dönüştürme

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; 

oldu bayt dizisi bölündü dize: Burada

Zaten ben belirtti ilk iki yol yapar sahip benim kod bölümüdür

"1E2021345A2B" 

Ama konsolda ondalık olarak görüntüler:

"303233529043" 

herkes için nasıl bana yardım eder misiniz gerçek değerleri onaltılık olarak al ve doğal olarak bu şekilde göster. Şimdiden teşekkür ederim.

+0

Neden sadece Integer.parseInt (sb.ToString(), 16) demiyorlar deneyin: Yerine String.format kolaylık yöntemi kullanarak, doğrudan bir Biçimlendirici kullanılır? – Luke

cevap

4

Bunu yapmak yolu:

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

Yine de, her baytın onaltılık olarak biçimlendirildiği bir bayt dizisi döndürmek istiyorum. Örneğin. dize 1E idi ve bayt ondalık olarak şimdi 30'dur ve baytın 1E'ye biçimlendirilmesini istiyorum. Bunu yapmanın bir yolu var mı? –

+0

1 bayt 'tanımlamak' için iki HEX karakter gerektirir. Hex chrar'ın ASCII kodunu kullanarak hex kodunu kodlarsanız 1 hex karakterini 1 bayt kullanarak temsil edebilirsiniz. Bu nedenle, ASCII'de onaltılık bir bayt tanımlamak için iki bayta ihtiyacınız vardır. Gerçekten ne istediğinden emin değilim. – Tamas

+0

1 tek bayt kullanan iki karaktere sahip olmak istiyorum. Örneğim için, 6 baytlık bir dizim var. –

22

Sen String javax.xml.bind.DatatypeConverter.printHexBinary(byte[]) kullanabilirsiniz. ör .:

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 kullanıyorum ve Android bunu desteklemiyor. Bunun etrafında başka bir yolu var mı? –

+2

Bulduğum diğer yolların en kısa yolu. – Alex

+0

VGR'nin cevabı Android'de de çalışıyor ve çok daha basit. – Ethan

16

String.format aslında java.util.Formatter sınıfının kullanır.

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

Bu soruya, standart olmayan kitaplıklara dayanmadığını tespit ettiğim en kısa, en basit yanıt budur. Çok mükemmel!!! – Ethan

-1

bu

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