有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将int转换为字节在Java和Actionscript中产生不同的结果

我想把整数转换成字节。我在Actionscript中有一个例子,我需要将其转换为Java。为了简单起见,我们假设只有一个数字,1234。这是我的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

我做错了什么,为什么结果不同?谢谢


共 (3) 个答案

  1. # 1 楼答案

    如果你转换-46 to a hex,你会得到0xD2,它可以被转换回210的十进制数。 这就是无符号整数和有符号整数之间的区别

    所以结果确实是相等的(虽然相等,但不完全相同) 只要两个代码产生相同的字节(D2),就可以继续

    哦,如果您不确定,只需让两个代码提供结果的十六进制值而不是十进制值,或者确保两者都返回有符号或无符号整数,而不是如上所述,那么您将得到相同的结果;)

    例如,在actionscript中检查c 通过这些方法:

    readInt()
    and
    readUnsignedInt()
    

    您应该看到readint返回-46,readunsignedint返回210

  2. # 2 楼答案

    Java使用无符号字节

    默认情况下,ActionScript可能已签名

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

    这可以将每个字节打印为无符号:

    System.out.println((b < 0 ? 256 + b : b));
    
  3. # 3 楼答案

    在java中,字节在转换为另一种类型时总是被认为是有符号的。这就是为什么你会看到一个负数

    试试看:

    Log.i(T, i + ": " + (array[i] & 0xff))