如何从文件中读取无符号值

时间:2013-12-20 11:11:30

标签: java unsigned

我正在尝试读取二进制数据(Doom WAD文件),其中包含大量无符号短和无符号字节值。

目前我将文件读入byte [],用一个带有小端序的ByteBuffer包围它,并分别通过bbuf.getShort()等访问这些值。

转换那些e。 G。 2D坐标不是问题,因为最终它们的范围是无关紧要的。从-128到128或从0到256,但更常见的是短值用作数组索引,短/字节值用作flags /,因此我需要一种快速的方法将它们视为有符号类型。 我知道,Java为了简单起见没有无符号类型...... 你能提出什么建议吗?

3 个答案:

答案 0 :(得分:1)

要保存未签名的int,您需要long。然后你需要截断最后32位。您可以使用以下技巧来完成它。

final long UNSIGNED_INT_BITS = 0xffffffffL;
int a = -3;
long b = UNSIGNED_INT_BITS & a;
System.out.println(a);
System.out.println(b);
System.out.println(Long.toHexString(UNSIGNED_INT_BITS));

输出:

-3
4294967293
ffffffff

答案 1 :(得分:0)

如果所有其他方法都失败了,您可以随时将它们作为整数存储在内部,并确保在读/写时进行适当的转换。

(读为字节/短,强制转换为int,如果为负则添加2 ^位。写入时只需截断为8/16位。)

我承认,这几乎不是最优雅的解决方案。

答案 2 :(得分:0)

如果需要将0xFF字节解释为256,请执行以下操作

int n = b & 0xFF;