【问题标题】:Working around no unsigned variables in java在java中解决无符号变量
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 效果很好,没有添加一行代码,非常感谢
猜你喜欢
  • 2016-12-25
  • 1970-01-01
  • 2019-04-09
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多