2011-08-07 67 views
3

我有一個可以是2,3或4大小的字節數組。我需要將其轉換爲正確的整數值。我也需要做相反的操作,例如一個2,3或4個字符的整數到一個字節數組。將US-ASCII編碼的字節轉換爲整數並返回

例如,原始十六進制字節爲:54和49.解碼的字符串US-ASCII值是61,所以,整數答案必須是61

我已經閱讀計算器等所有的轉換問題,我可以找到,但他們都給出了完全錯誤的答案,我不知道它是否可以編碼?

如果我做new String(lne,"US-ASCII"),其中lne是我的字節數組,我得到正確的61.但是,當這樣做((int)lne[0] << 8) | ((int)lne[1] & 0xFF),我得到了完全錯誤的答案。

這可能是一個愚蠢的錯誤,或者我完全不理解Java中的數字表示方案和編碼/解碼思想。

任何幫助,將不勝感激。

注意:我知道我只能將字符串解析爲整數,但我想知道是否有方法使用快速操作,如移位和二進制算術來代替?

回答

3

您需要兩個轉換步驟。首先,將你的ascii字節轉換爲一個字符串。這就是new String(lne,"us-ascii")爲你做的。 Then,將數字的字符串表示形式轉換爲實際數字。爲此,您使用類似Integer.parseInt(theString)的東西 - 請記住處理NumberFormatException。

1

正如你所說,new String(lne,"US-ASCII")會給你正確的字符串。將字符串轉換爲整數,使用int myInt = Integer.parseInt(new String(lne,"US-ASCII"));

4

下面是關於如何使用像字節轉換和數字算術運算速度快於加快這一個念頭。假設你有當前代碼:

byte[] token; // bytes representing a bunch of ascii numbers 
int n = Integer.parseInt(new String(token)); // current approach 

然後,你可以替換,而不是最後一行,並執行以下(假設沒有負數,沒有外國的langauge字符等):

int n = 0; 
for (byte b : token) 
    n = 10*n + (b-'0'); 

出的興趣,這導致我在大量數據集上的速度大約提高了28%。我認爲這是由於沒有分配新String對象,然後將每個parseInt電話後垃圾他們。

相關問題