1、2、4、または8バイトの場合は、get()、getShort()、getInt()、およびgetLong()を使用します。
誰かが私が3、5、または7バイトで長くするために使用する必要があるロジックを手伝ってもらえますか?どういうわけかゼロで漕ぐ必要があるでしょう。
1、2、4、または8バイトの場合は、get()、getShort()、getInt()、およびgetLong()を使用します。
誰かが私が3、5、または7バイトで長くするために使用する必要があるロジックを手伝ってもらえますか?どういうわけかゼロで漕ぐ必要があるでしょう。
この問題の答えは、データのバイト順序によって異なります。JavaのByteBufferクラスには、エンディアンを設定するためのorder(ByteOrder)メソッドがありますが、これは非標準の長さの整数/長さの値には役立ちません。
bbがByteBufferであり、lengthが既知のデータ長であると想定します。値変数は結果を格納します。
これは、以下の両方のソリューションで使用されるヘルパー関数であり、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());
}
数値を別の数値にキャストするときは、最大値ビットを符号拡張します。(つまり、最上位ビットが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