0

我正在为我无法控制的特定文件格式编写文件保存和加载函数,并且格式指定在特定字节位置我必须写入 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 搞砸了按位或运算...

我的问题是我必须做些什么来解决这个问题?

谢谢你。

4

1 回答 1

3

当您加载字节时,它们会被签名。当它们被强制转换为整数时,它们是符号扩展的。为了解决这个问题,您可以对 0xFF 进行按位与运算,只取带符号整数的 8 个 LSb。

在您的情况下value |= (data[index+i])应该成为value |= (data[index+i] & 0xFF)(其中i替换为您拥有的索引偏移量)。

于 2012-06-26T18:27:24.300 回答