如果你有1,2,4或8個字節,你只需要使用get(),getShort(),getInt()和getLong()。當你有奇數個字節時,如何從ByteBuffer(Little Endian)獲得一個long?
有人可以幫幫忙,我應該用它來獲得一個長有3,5或7個字節的邏輯是什麼?我可能不得不以某種方式用零劃一。
如果你有1,2,4或8個字節,你只需要使用get(),getShort(),getInt()和getLong()。當你有奇數個字節時,如何從ByteBuffer(Little Endian)獲得一個long?
有人可以幫幫忙,我應該用它來獲得一個長有3,5或7個字節的邏輯是什麼?我可能不得不以某種方式用零劃一。
回答這個問題要看你的數據的字節順序。 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());
}
我有一個「大腦放屁」和忘記了,而不是使用getUnsigned功能,您可以改爲按位與字節乘0xFF得到相同的結果。 – bohney
當你施放一個號碼到另一個號碼,你符號擴展的最大價值位。 (換句話說,如果最高位爲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
不想問很多,但我該如何將這些字節變成長整型? (我想我可以只考慮Java源代碼,並通過自己找出來,但如果你知道,從你的頭頂將是有益的THX – TraderJoeChicago
不管你多少字節需要,這個過程是一樣的。!取最高位,並且將其擴展 - 它是硬件整數,短褲,字節之間如何管型,渴望 –
你爲什麼短期多頭?這是如何定義協議? – EJP
只需三個字節並將它們串在一起,不是嗎? –