我正在为我无法控制的特定文件格式编写文件保存和加载函数,格式指定在特定字节位置我必须写入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操作搞砸...
我的问题是我该怎样做才能解决这个问题?
谢谢。
答案 0 :(得分:3)
当您加载字节时,它们会被签名。当它们被强制转换为整数时,它们会被扩展。要解决这个问题,你可以用0xFF进行按位AND,只取符号整数的8个LS。
在您的情况下,value |= (data[index+i])
应该变为value |= (data[index+i] & 0xFF)
(其中i
将替换为您拥有的索引偏移量。)