我正在尝试读取二进制数据(Doom WAD文件),其中包含大量无符号短和无符号字节值。
目前我将文件读入byte [],用一个带有小端序的ByteBuffer包围它,并分别通过bbuf.getShort()等访问这些值。
转换那些e。 G。 2D坐标不是问题,因为最终它们的范围是无关紧要的。从-128到128或从0到256,但更常见的是短值用作数组索引,短/字节值用作flags /,因此我需要一种快速的方法将它们视为有符号类型。 我知道,Java为了简单起见没有无符号类型...... 你能提出什么建议吗?
答案 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;