2009-10-27 41 views
1

我試圖將HEX序列轉換爲以ISO-8859-1,UTF-8或UTF-16BE編碼的字符串。也就是說,我有一個字符串,如下所示:"0422043504410442"這表示UTF-16BE中的字符:​​。從Java中的HEX字符串創建ISO-8859-1字符串,移位

我用兩種格式之間進行轉換的代碼是:

private static String hex2String(String hex, String encoding) throws UnsupportedEncodingException { 
    char[] hexArray = hex.toCharArray(); 

    int length = hex.length()/2; 
    byte[] rawData = new byte[length]; 
    for(int i=0; i<length; i++){ 
     int high = Character.digit(hexArray[i*2], 16); 
     int low = Character.digit(hexArray[i*2+1], 16); 
     int value = (high << 4) | low; 
     if(value > 127) 
       value -= 256; 
     rawData[i] = (byte) value; 
    } 
    return new String(rawData, encoding); 
} 

這似乎爲我工作得很好,但我還是對這次兩個問題:

  1. 有沒有更簡單方式(最好沒有位處理)做這種轉換?
  2. 我該如何解釋該行:int value = (high << 4) | low;

我很熟悉位處理的基礎知識,儘管沒有Java語法。我相信第一部分將所有位左移4步。儘管其他我不明白,爲什麼它會在這種情況下有所幫助。

對於我的問題中的任何混淆,我表示抱歉,請讓我知道我是否應該澄清任何事情。 謝謝。 // Abeansits

回答

2

有沒有什麼簡單的方法(最好不位處理)做這種轉換?

無我會知道的 - 唯一的簡化似乎(例如,使用int value = Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16);

public static byte[] hexToBytes(final String hex) { 
    final byte[] bytes = new byte[hex.length()/2]; 
    for (int i = 0; i < bytes.length; i++) { 
    bytes[i] = (byte) Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16); 
    } 
    return bytes; 
} 

我怎麼解釋線分析整個字節一次,而不是解析由數字位數:INT值=(高< < 4)|低;?

看看這個例子您的最後兩位數字(42):

int high = 4; // binary 0100 
int low = 2; // binary 0010 
int value = (high << 4) | low; 

int value = (0100 << 4) | 0010; // shift 4 to left 
int value = 01000000 | 0010; // bitwise or 
int value = 01000010; 
int value = 66; // 01000010 == 0x42 == 66 
1

您可以*+取代在這種情況下<<|,但我不建議這樣做。

表達

int value = (high << 4) | low; 

相當於

int value = high * 16 + low; 

256的減法之間-128和127是不必要的得到的值。簡單地將128例如轉換爲一個字節將產生正確的結果。 int 128的最低8位具有與byte -128:0x80相同的模式。

我想它只是寫爲:

rawData[i] = (byte) ((high << 4) | low); 
1

有沒有什麼簡單的方法(最好 無位處理)做到這一點 轉換?

您可以在Apache共享中使用Hex類,但在內部它可以做同樣的事情,可能會有細微差別。

我該如何解釋該行:int value = (high << 4) | low;

這將兩個十六進制數字組合成一個無符號的8位數值,其中每個數字代表4位,存儲爲int。接下來的兩行將其轉換爲簽名的Java byte