1

整数をバイトに変換したいのですが。Actionscriptに例があり、Javaに変換する必要があります。簡単にするために、1234という1つの数字だけを想定しましょう。これは私のJavaコードです。

int[] a = {1234};
ByteBuffer byteBuffer = ByteBuffer.allocate(a.length * 4);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
intBuffer.put(a);
byte[] array = byteBuffer.array();
for (int i=0; i < array.length; i++) {
    Log.i(T, i + ": " + array[i]);
}

これにより、次の結果が得られます。

0 : 0
1 : 0
2 : 4
3 : -46

Actionscriptにいる間、私はこれを持っています:

var c:ByteArray = new ByteArray;
c.writeInt(1234);
for(var p:uint=0; p<c.length; p++) {
    trace(p+" : "+c[p]);
}

そして結果:

0 : 0
1 : 0
2 : 4
3 : 210

私は何を間違っているのですか、なぜ結果が異なるのですか?ありがとう!

4

3 に答える 3

2

Javaは符号なしバイトを使用します。

おそらくデフォルトで署名されたActionScript 。

3 : -46 //signed
3 : 210 //unsigned

これにより、すべてのバイトが符号なしとして出力されます。

System.out.println((b < 0 ? 256 + b : b));
于 2013-02-06T02:30:55.880 に答える
2

Javaでは、バイトは別のタイプに変換されるときに常に署名されていると見なされます。そのため、負の数が表示されます。

試す:

Log.i(T, i + ": " + (array[i] & 0xff))
于 2013-02-06T02:31:22.587 に答える
0

変換すると、小数に変換して戻すことができ-46 to a hexます。これが、符号なし整数と符号付き整数の違いです。0xD2210

したがって、結果は確かに等しくなります(ただし、等しくなりますが、同一ではありません)。両方のコードが同じバイト(D2)を生成する限り、問題はありません。

ああ、確信が持てない場合は、両方のコードが結果の10進値ではなく16進値を提供するようにするか、両方が符号付きまたは符号なしの整数を返すようにし、上記のようにしないと、同じ結果が得られます;)

たとえば、これらのメソッドを使用してActionScriptのcを確認します。

readInt()
and
readUnsignedInt()

readintが-46とreadunsignedint210を返すことがわかります。

于 2013-02-06T02:51:41.837 に答える