2011-01-22 42 views
21

我有一個byte[],我從文件中讀取,我想從它的兩個字節得到一個int。這裏有一個例子:將兩個字節讀入一個整數?

byte[] bytes = new byte[] {(byte)0x00, (byte)0x2F, (byte)0x01, (byte)0x10, (byte)0x6F}; 
int value = bytes.getInt(2,4); //This method doesn't exist 

這應該使value等於0x0110,或272十進制。但顯然,byte[].getInt()不存在。我怎樣才能完成這項任務?

上面的數組只是一個例子。我不知道實際值。

+0

答案的工作原因是字節被提升爲整數,以防止導致理解困難的原因。 「字節[2] * 256」不適合一個字節,但這不是問題,因爲「256」是一個整數等。 – SyntaxT3rr0r 2011-01-22 16:26:26

+1

[Convert 4 bytes to int]的可能重複(http://stackoverflow.com/questions/2383265/convert-4-bytes-to-int) – finnw 2011-01-22 16:32:42

回答

36

你應該只選擇簡單的:

int val = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff); 

你甚至可以編寫自己的輔助函數getBytesAsWord (byte[] bytes, int start)給你的功能,如果你不想計算尖刻的代碼,但我認爲這可能太過分了。

+1

理想情況下,它應該是(b1 << 8)| (b2&0x00ff) 如果第二個字節值大於128,則上述轉換給出的值不正確,因爲java認爲該字節爲負int。 – Gopi 2014-08-14 12:09:36

+0

爲什麼'0xff`?換句話說,`bytes [0] << 8 |有什麼區別?字節[1]`? – arve0 2016-07-27 19:51:41

1

或者,你可以使用:

int val = (bytes[2] << 8) + bytes[3] 
6

嘗試:

public static int getInt(byte[] arr, int off) { 
    return arr[off]<<8 &0xFF00 | arr[off+1]&0xFF; 
} // end of getInt 

你的問題沒有說明什麼有兩個參數(2,4)的意思。 2和4在你的例子中是沒有意義的數組中的索引來找到ox01和0x10,我猜你想要連續使用兩個元素,這是一個常見的事情,所以我在我的方法中使用了off + off。

你不能在java中擴展byte []類,所以你不能有一個方法bytes.getInt,所以我提出了一個使用byte []作爲第一個arg的靜態方法。

該方法的'技巧'是你的字節是8位有符號整數和值超過0x80是負數,並將符號擴展(即使用時作爲一個整數0xFFFFFF80)。這就是爲什麼需要'& 0xFF'掩碼。 '838'將較高有效字節8位左移。 '|'結合這兩個值 - 就像'+'一樣。操作員的順序非常重要,因爲< <的優先級最高,其次是&,後面緊跟| - 因此不需要括號。

0

您可以使用ByteBuffer。它有你正在尋找的getInt方法和許多其他有用的方法

2

這是一個很好的簡單可靠的方法。

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4); 
    // by choosing big endian, high order bytes must be put 
    // to the buffer before low order bytes 
    byteBuffer.order(ByteOrder.BIG_ENDIAN); 
    // since ints are 4 bytes (32 bit), you need to put all 4, so put 0 
    // for the high order bytes 
    byteBuffer.put((byte)0x00); 
    byteBuffer.put((byte)0x00); 
    byteBuffer.put((byte)0x01); 
    byteBuffer.put((byte)0x10); 
    byteBuffer.flip(); 
    int result = byteBuffer.getInt(); 
0

Google Base16類來自Guava-14.0.1。

new BigInteger(com.google.common.io.BaseEncoding.base16().encode(bytesParam),16).longValue();