【发布时间】:2012-06-28 03:25:11
【问题描述】:
我正在为我无法控制的特定文件格式编写文件保存和加载函数,并且格式指定在特定字节位置我必须写入 4 个字节的数据来表示 32 位无符号值...我的测试文件这个值是 16052,或者 0x00003EB4...所以我将数据写入字节数组,它将以这种方式保存:
data[index] = 0xB4;
data[index+1] = 0x3E;
data[index+2] = 0x00;
data[index+3] = 0x00;
您可以看到数据是 little-endian 格式,这是正确的...问题是当我尝试使用文件加载函数加载这些数据时,java 会看到这样的数据:
-76, 62, 0, 0
0xB4 值被解释为 -76,因为字节是在 java 中签名的...当我尝试使用以下代码将这 4 个字节重新组合为单个 32 位值时,该值最终为 -76...
value = data[index+3];
value <<= 8;
value |= data[index+2];
value <<= 8;
value |= data[index+1];
value <<= 8;
value |= data[index];
这应该做的是: 将值设置为 0x00(高位字节),左移 8 位,或 0x00 到低 8 位,左移 8 位,或 0x3E 到低 8 位,左移 8 位,或 0xB4(低位字节)到低 8 位。
这应该会产生值 0x00003EB4...这是我开始使用的...但是由于某种原因我无法弄清楚它在该操作之后给了我值 -76。
我确信这是由于 java 将 0xB4 字节解释为值 -76 搞砸了按位或运算...
我的问题是我必须做些什么来解决这个问题?
谢谢。
【问题讨论】:
-
更多信息,如果我在重组值的最终操作上设置一个断点 (value |= data[index];) 我看到“value”变量的值为 15872,即是 0x00003E00 ... 这是正确的,正是我所期望的。我设置断点的最后一个操作应该按位或值 0xB4 到该值的低位字节......但它没有这样做。在我执行最后一个操作后,“value”变量的值为-76,这就是问题所在。
标签: java boolean bit-manipulation unsigned signed