C#コードをJavaに移行し、署名していないショートアレイ変換、およびバイトアレイ変換
質問
私は以前に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でCustom Bit Convrterを使用しています。とにかく、私がJavaについて理解していることから、バイトと同じ結果を使用したい場合、[]自分の値(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、-69]代わりに[42、59]です。最後のバイトは、本来のバイトよりも128程度です。これを適切に行う方法と、私の論理が正しい場合は、本当にいくつかのポインターが必要です。また、Uint、Ulongなどについても同じことをする必要があるので、これを正しく理解する必要があります。
解決
私はあなたがやろうとしている変換の背後にある理由を理解していないか、それらが誤って考えられていることを意味します。
タイプ byte
Javaでは、タイプとまったく同じです sbyte
C#で、C#ですべてのテストを行うことができます sbyte
Javaに移植する前に、物事が正しく機能することを確認してください。
(byte)0xaa = 170
(sbyte)0xaa = -86
(byte)0xbb = 187
(sbyte)0xbb = -69
したがって、Javaでは、バイト配列は{-86、-69}でなければなりません。
他のヒント
私はそれをテストしませんでしたが、私がすることはこれです:
public class Ushort {
private int value = 0;
public Ushort(int i) { // Changed
if (i > 0xFFFF || i < -(0xFFFF))
throws IllegalArgumentException("integer overflow")
value = i;
}
public int get() {
return value;
}
public byte[] getBytes() { // Changed! (Use & 0xFF)
return new byte[]{
(byte) ((value >>> 8) & 0xFF),
(byte) (value & 0xFF)};
}
}
所属していません StackOverflow