在java中解决无符号变量的问题

在java中解决无符号变量的问题,java,boolean,bit-manipulation,unsigned,signed,Java,Boolean,Bit Manipulation,Unsigned,Signed,我正在为我无法控制的特定文件格式编写文件保存和加载函数,该格式指定在特定字节位置我必须写入4个字节的数据以表示32位无符号值。。。在我的测试文件中,这个值是16052,或0x00003EB4。。。因此,我将数据写入字节数组,该数组将以以下方式保存: data[index] = 0xB4; data[index+1] = 0x3E; data[index+2] = 0x00; data[index+3] = 0x00; 您可以看到数据是小端格式的,这是正确的。。。问题是,当我尝试使用文件加载函数

我正在为我无法控制的特定文件格式编写文件保存和加载函数,该格式指定在特定字节位置我必须写入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];
value=data[index+3];

值加载字节时,它们是有符号的。当它们被强制为整数时,它们是符号扩展的。要解决此问题,可以使用0xFF执行按位AND,以仅获取有符号整数的8个LSB


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

加载字节时,它们被签名。当它们被强制为整数时,它们是符号扩展的。要解决此问题,可以使用0xFF执行按位AND,以仅获取有符号整数的8个LSB


在你的例子中,
value |=(data[index+i])
应该变成
value |=(data[index+i]&0xFF)
(其中,
i
被替换为你拥有的索引偏移量)。

进一步信息的可能重复,如果我在重新组合值(value |=data[index])的最后操作上设置断点,我会看到“value”变量是15872,它是0x00003E00…这是正确的,也正是我所期望的。设置断点的最后一个操作应该是按位或将值0xB4放到该值的低阶字节上…但它没有这样做。在我执行最后一个操作一次后,“value”的值“变量是-76,这就是问题所在。进一步的信息可能会重复,如果我在重新组合值(值|=数据[索引];)的最终操作上设置断点,我会看到“值”变量的值是15872,即0x00003E00…”。。。这是正确的,也正是我所期望的。设置断点的最后一个操作应按位或将值0xB4插入该值的低位字节。。。但事实并非如此。在我执行最后一个操作一次之后,“value”变量的值是-76,这就是问题所在。它工作得很好,没有添加一行代码,非常感谢。它工作得很好,没有添加一行代码,非常感谢