2010-12-20 152 views
15

我需要將2字節數組(byte [2])轉換爲java中的整數值。我怎樣才能做到這一點?Java:將字節轉換爲整數

+5

這個問題可以使用一些說明。就目前而言,我們只會看到您選擇的答案的含義。 – 2010-12-20 18:45:15

回答

24

您可以使用ByteBuffer此:

ByteBuffer buffer = ByteBuffer.wrap(myArray); 
buffer.order(ByteOrder.LITTLE_ENDIAN); // if you want little-endian 
int result = buffer.getShort(); 

又見Convert 4 bytes to int

+5

+1 ByteBuffer解決方案 – Casey 2010-12-20 19:13:46

+0

謝謝你的工作。 ByteBuffer會處理簽名和未簽名的字節嗎? – keshav 2010-12-20 19:54:52

+0

@keshav:你是什麼意思?沒有「簽名」或「未簽名」字節這樣的事情。一個字節只是一組「0」和「1」;只有**的含義在於你如何解釋這些數字。 – 2010-12-20 20:13:54

3

那麼,每個字節是一個在-128..127範圍內的整數,所以你需要一種方法將一對整數映射到一個整數。有很多方法可以做到這一點,這取決於你在這對字節中編碼的內容。最常見的是將一個16位有符號整數存儲爲一對字節。轉換是回到一個整數取決於你是否保存其大端形式:

(byte_array[0]<<8) + (byte_array[1] & 0xff) 

或小尾數:

(byte_array[1]<<8) + (byte_array[0] & 0xff) 
10

在Java中,字節簽署,這意味着一個字節的值可以爲負,當發生這種情況時,@ MattBall的原始解決方案將無法工作。

例如,如果字節陣列的二進制形式是這樣的:

然後myArray的[0]是1000 1101和myArray的[1]是1000 1101,字節1000 1101的十進制值是-115而不是141(= 2^7 + 2^3 + 2^2 + 2^0)

如果我們使用

int result = (myArray[0] << 8) + myArray[1]

該值將是-16191這是錯誤的。

之所以它的錯誤是,當我們解釋一個2字節數組轉換成整數,所有的字節 無符號的,所以翻譯時,我們應該映射符號字節爲無符號整數:

((myArray[0] & 0xff) << 8) + (myArray[1] & 0xff)

結果是36237,使用計算器或ByteBuffer來檢查它是否正確(我已經完成了它,是的,它是正確的)。

+0

非常感謝您的解釋:) – shadygoneinsane 2017-08-24 13:15:25

3

另外,如果你可以使用番石榴庫:

Ints.fromByteArray(0, 0, myArray[1], myArray[0]); 

這是值得一提,因爲很多項目無論如何使用它。

3

只要做到這一點:

return new BigInteger(byte[] yourByteArray).intValue(); 

藍牙命令轉換偉大工程等等。沒有必要擔心簽訂無符號與轉換。