2013-02-06 51 views
1

我想将整数转换为字节。我在Actionscript中有一个例子,我需要将它转换为Java。为了简便起见,我们假设只有一个号码,1234这是我的Java代码:将int转换为字节 - Java和Actionscript中的不同结果

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 

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

回答

2

Java使用无符号的字节。

动作脚本可能是默认签署了

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

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

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

谢谢,这是它! – Fygo

2

在Java字节总是认为当转换为另一种类型的签名。这就是为什么你看到一个负数。

尝试:

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

如果转换-46 to a hex你会得到0xD2至极可以转换回210小数。 这是无符号整数和有符号整数的区别。

所以结果确实是相等的(虽然相同,但不完全相同) 只要两个代码产生相同的字节(D2),您就可以轻松前往。噢,如果你不确定,只需让两个代码提供十六进制值而不是结果的十进制值,或者确保两者都返回有符号或无符号整数,而不是上面那样,那么你将得到相同的结果结果;)

例如支票C在ActionScript 与方法:

readInt() 
and 
readUnsignedInt() 

你应该看到的readInt返回-46和readunsignedint 210