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

Posted

技术标签:

【中文标题】将 int 转换为字节 - Java 和 Actionscript 中的不同结果【英文标题】:Convert int to bytes - different result in Java & Actionscript 【发布时间】:2013-01-21 03:36:42 【问题描述】:

我想将整数转换为字节。我在 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

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

【问题讨论】:

【参考方案1】:

Java 使用 无符号 字节。

ActionScript 可能默认签名

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

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

System.out.println((b < 0 ? 256 + b : b));

【讨论】:

【参考方案2】:

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

试试:

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

【讨论】:

【参考方案3】:

如果您转换-46 to a hex,您将得到0xD2,它可以转换回210 的小数。 这就是无符号整数和有符号整数的区别。

所以结果确实是相等的(虽然相等,但不相同) 只要两个代码产生相同的字节 (D2),你就可以开始了。

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

例如在 actionscript 中检查 c 使用这些方法:

readInt()
and
readUnsignedInt()

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

【讨论】:

以上是关于将 int 转换为字节 - Java 和 Actionscript 中的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

Java - 将 Int 转换为字节 - 奇怪的结果

Java 将 4 个字节转换为 int

JAVA中int强制转换byte

JAVA中int强制转换byte

C语言如何将int类型转换成字符串

将字节数组转换为java类型