2012-09-28 14 views
1

如果你有1,2,4或8個字節,你只需要使用get(),getShort(),getInt()和getLong()。當你有奇數個字節時,如何從ByteBuffer(Little Endian)獲得一個long?

有人可以幫幫忙,我應該用它來獲得一個長有3,5或7個字節的邏輯是什麼?我可能不得不以某種方式用零劃一。

+0

你爲什麼短期多頭?這是如何定義協議? – EJP

+0

只需三個字節並將它們串在一起,不是嗎? –

回答

2

回答這個問題要看你的數據的字節順序。 Java的ByteBuffer類有一個順序(ByteOrder)方法來設置字節順序,但是這對於非標準長度的整數/長度值不會有幫助。

假設BB是一個字節緩衝區和長度是已知的數據長度。值變量存儲結果。

這是在以下兩個解決方案中使用和需要,因爲Java沒有無符號的數據類型(我覺得可怕的)一個輔助函數:

private static long getUnsigned(final byte b) { 
    if (b < 0) { 
     return (long) b + 256; 
    } 
    return b; 
} 

這裏是一個小端的解決方案:

long value = 0; 
for (int shift = 0; shift < length * 8; shift += 8) { 
    value |= getUnsigned(bb.get()) << shift; 
} 

這裏是一個大端解決方案:

long value = 0; 
for (int i = 0; i < length; ++i) { 
    value <<= 8; 
    value |= getUnsigned(bb.get()); 
} 
+0

我有一個「大腦放屁」和忘記了,而不是使用getUnsigned功能,您可以改爲按位與字節乘0xFF得到相同的結果。 – bohney

2

當你施放一個號碼到另一個號碼,你符號擴展的最大價值位。 (換句話說,如果最高位爲1,則用1​​填充,如果最高位爲0,則用0填充)

因此,在小端中,可以找到最高位(最左邊在最右邊的字節位),那麼你要麼FF或00

實例添加一個字節,可以說你在小尾數3字節數:

0000 0000 | 0000 0000 | 1000 0000 

你的最高位是1 (在最後字節的1),所以,在4個字節的符號擴展的結果是:

0000 0000 | 0000 0000 | 1000 0000 | 1111 1111 

同樣,如果3字節數是:

1111 1111 | 1111 1111 | 0101 1101 

然後4個字節的符號擴展的版本是:

1111 1111 | 1111 1111 | 0101 1101 | 0000 0000 
+0

不想問很多,但我該如何將這些字節變成長整型? (我想我可以只考慮Java源代碼,並通過自己找出來,但如果你知道,從你的頭頂將是有益的THX – TraderJoeChicago

+0

不管你多少字節需要,這個過程是一樣的。!取最高位,並且將其擴展 - 它是硬件整數,短褲,字節之間如何管型,渴望 –