簡體   English   中英

從Java中的HEX字符串創建ISO-8859-1字符串,移位

[英]Creating a ISO-8859-1 string from a HEX-string in Java, shifting bits

我正在嘗試將HEX序列轉換為以ISO-8859-1,UTF-8或UTF-16BE編碼的字符串。 也就是說,我有一個字符串看起來像: "0422043504410442"這代表字符:UTF-16BE中的"Test"

我用來在兩種格式之間轉換的代碼是:

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; int value = (high << 4) | low;

我熟悉位處理的基礎知識,盡管Java語法完全沒有。 我相信第一部分將所有位向左移動4步。 雖然其余的我不明白,為什么它會在這種情況下有所幫助。

對於我的問題中的任何疑惑,我道歉,如果我要澄清任何事情,請告訴我。 謝謝。 // Abeansits

有沒有更簡單的方法(最好沒有位處理)來進行這種轉換?

沒有我會知道 - 唯一的簡化似乎是一次解析整個字節而不是逐位解析(例如使用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 value =(high << 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

你可以替換<<| 在這種情況下使用*+ ,但我不推薦它。

表達方式

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);

有沒有更簡單的方法(最好沒有位處理)來進行這種轉換?

你可以在Apache commons中使用Hex類,但在內部,它會做同樣的事情,也許會有細微的差別。

我怎么解釋這一行: int value = (high << 4) | low; int value = (high << 4) | low;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM