2013-10-03 249 views
1

我試圖將十六進制字符(b8aa30d8f1d398883f0eeb5079777c42)的32字節字符串轉換爲十六進制值的16字節字符串(x'b8aa30d8f1d398883f0eeb5079777c42' )將32字節的十六進制字符串轉換爲16字節的十六進制字符串

我試過了一些我在這裏找到的建議。

StringBuffer sb = new StringBuffer(); 
    for (int i = 0; i < input.length(); i++) { 
     String s = input.substring(i, i + 2);  
     byte value = Byte.valueOf(s, 16); 
         sb.append(value); 
    } 

這導致此異常:值超出範圍。價值:「B8」基數:16

  String bin = ""; 
    String binFragment = ""; 
    int iHex; 
    hex = hex.trim(); 
    hex = hex.replaceFirst("0x", ""); 

    for(int i = 0; i < hex.length(); i++){ 
     iHex = Integer.parseInt(""+hex.charAt(i),16); 
     binFragment = Integer.toBinaryString(iHex); 

     while(binFragment.length() < 4){ 
      binFragment = "0" + binFragment; 
     } 
     bin += binFragment; 
    } 

這不處理0領先的正確

沒有人有辦法做到這一點的轉換?

我也嘗試這樣的:

public static void convert() { 
    String s = "0c871eea3af7526f9b2e7054f6277984"; 
    byte[] bytes = DatatypeConverter.parseHexBinary(s); 
    StringBuilder outputStringBuilder = new StringBuilder(); 
    for (byte currentByte : bytes) { 
     outputStringBuilder.append((char) currentByte); 
    } 
    System.out.println(String.format("%s, %s", bytes, bytes.length)); 
    String out = bytes.toString(); 
    System.out.println(String.format("%s, %s", out, out.length())); 
} 

並得到了這些結果: [B @ f01a1e,16 [B @ f01a1e,9

有字節數組中的16個字節在創建之前輸出字符串,但只有9個之後。

+1

」十六進制值的字節串「。這沒有意義。 – OldProgrammer

+0

請發佈更多輸入和輸出的例子,字節也是有符號的,所以b8太大而不適合字節 – vandale

+0

'Integer.toBinaryString()'會將整數轉換爲一個零的字符串,它是那個整數的二進制表示。這是你真正想要的嗎?你不會得到一個16字節的字符串,你會得到一個128字節的零和一串字符串。也許你想要將32字節的十六進制字符串轉換爲一個字節數組?這會給你一個16字節的二進制數組。 – Eran

回答

0

如果我正確理解你,你試圖將一串字節(以十六進制符號給出的字符串)轉換爲相應的字符。

可以使用DatatypeConverter類的十六進制字符串轉換爲字節數組...

byte[] bytes = DatatypeConverter.parseHexBinary(inputString); 

...每個字節轉換爲它所代表的字符:

StringBuilder outputStringBuilder = new StringBuilder(); 
for (byte currentByte : bytes) { 
    outputStringBuilder.append((char) currentByte); 
} 
+1

雖然這會產生垃圾('ㅈㄺ0￱ㅜリネ?→Pyw| B'),所以我不確定您是否可能試圖實現其他目的。 –

0

那麼,第二次嘗試的問題是,您一次讀取兩個十六進制字符(這是正確的,因爲每對十六進制字符都是單個字節),但是您的循環條件和增量是錯誤的。

試試這個:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < input.length()/2; i+=2) { 
    String s = input.substring(i, i + 2);  
    byte value = Byte.valueOf(s, 16); 
        sb.append(value); 
} 

此外,您也應該檢查輸入有偶數個十六進制字符。 「

相關問題