私は以前に C# で書いたコードを Java で書いています (私は Java にはかなり慣れていません)。C# のコードと例を次に示します。
ushort number = 0xAABB; // 43707
byte[] data = new byte[2];
EndianBitConverter.Big.CopyBytes(number, data, 0); // value[0] = 170, value[1] = 187
デフォルトでリトル エンディアンに設定されているため、.NET でカスタム ビット コンバーターを使用しています。とにかく、Java について私が理解していることから、byte[] と同じ結果を使用したい場合、値 (170 と 187) が 128 (Byte.MAX_VALUE + 1)、つまり (42, 59) だけ小さくなると予想する必要があります。 - .net と Java ではバイト型の範囲が異なるため。上記のロジックを模倣するためにJavaで書いたものを次に示します。
public class Ushort {
private int value = 0;
public Ushort(int i) {
value = i - (Short.MAX_VALUE + 1);
}
public int get() {
return value;
}
public byte[] getBytes() {
byte[] result = new byte[]{
(byte) (value >>> 24),
(byte) (value >>> 16),
(byte) (value >>> 8),
(byte) value};
return new byte[]{result[2], result[3]};
}
}
ただし、上記のコードを呼び出すと
new Ushort(0xAABB).getBytes()
結果は [42, 59] ではなく [42, -69] です。最後のバイトは、本来よりも 128 小さくなっています。これを適切に行う方法と、私のロジックが正しいかどうかについて、いくつかの指針が本当に必要です。uint や ulong などについても同様に行う必要があるため、これを正しく理解する必要があります。