【发布时间】:2014-06-06 04:43:16
【问题描述】:
假设我们有以下字节[4]:
44 a4 8a c6
那么下面的代码有什么问题:
public static int asIntBigEndian(byte[] raw, int offset){
int result = 0;
for(int i=offset; i<offset+4; ++i){
result = (result << 4) | raw[i];
}
return result;
}
调用asIntBigEndian(raw, 0)的结果是:
ff ff ff e6
我注意到的是,如果我要读取第一个字节并将其打印出来,我会得到:
44
如果我这样做,我会得到相同的结果:
System.out.println(Integer.toHexString(raw[0] << 24));
0x44000000
所以如果我继续逻辑......
System.out.println(Integer.toHexString( (raw[0] << 24)|(raw[1] << 16) );
0xffa40000
基本上第一个字节变成了 0xff,而第二个字节 0xa4 已经“异或”到了正确的位置。为什么会这样?
【问题讨论】:
-
数字不是用 Java 签名的吗?
-
那些不是有效的字节值。请给我们一个最小的工作示例。
-
@AnubianNoob 是的,Java 已签名......但如果我用十六进制打印它应该没关系吧?
-
@SotiriosDelimanolis 你是什么意思他们不是有效的字节值? 0x44a48ac6 = 1151634118。
-
@ChaosXDemon 0xA4 不是有效的
byte值。 Java 中的bytes 的范围是 -128 到 127(-0x80 到 0x7F)
标签: java int byte endianness