我正在为我无法控制的特定文件格式编写文件保存和加载函数,并且该格式指定在特定字节位置我必须写入 4 个字节的数据来表示 32 位无符号值......在我的测试文件中,此值为 16052,即0x00003EB4...所以我将数据写入将以这种方式保存的字节数组:
data[index] = 0xB4;
data[index+1] = 0x3E;
data[index+2] = 0x00;
data[index+3] = 0x00;
您可以看到数据是小端格式,这是正确的...问题是当我尝试使用我的文件加载函数加载此数据时,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,这搞砸了按位 OR 操作......
我的问题是我必须做些什么来解决这个问题?
谢谢。
加载字节时,它们是有符号的。 当它们被强制转换为整数时,它们被符号扩展。 要解决此问题,您可以对 AND 执行按位 AND,0xFF仅获取有符号整数的 8 个 LSb。
在您的情况下value |= (data[index+i])
应该变为value |= (data[index+i] & 0xFF)
(其中i
替换为您拥有的索引偏移量)。