1

在 Java 中,我只是将一个文件读入 ByteBuffer。当我开始检查以确保 ByteBuffer 包含正确的字节时,我注意到它大部分具有正确的开始和结束字节,除了第 3 个字节,它有 -117 而不是 emacs 所说的应该是 139(8b in hexl -模式)。是什么赋予了?这与Big/Little Endian..有关吗?

为了清楚起见,根据 emacs,前四个字节应该是:

1f:8b:08:00 等于 31 139 8 0

我的java得到:

31 -117 8 0

有任何想法吗?

4

3 回答 3

5

Javabyte是有符号的,因此它的范围是 -128..127 而不是 0..255。考虑到这一点,您的字节是正确的。如果字节的无符号值为 ,则有符号的值为X-(X - 256)因此,对于139,有符号的值为139 - 256 = -117

于 2009-08-27T22:48:48.447 回答
3

Java 的整数类型(包括byte)是有符号的:它们的范围是从 -128 到 127,而不是像您预期的那样是 0 到 255。任何高位为 1 (1### ####) 的数字都是负数。

很多人都写过这个。

于 2009-08-27T22:50:21.953 回答
2

这有点切题,但是如果您尝试使用有符号字节,则以下内容可能会很有用。

由于大多数操作都会将 Javabyte提升为 -int保留符号和大小 - 屏蔽高位是很常见的,如下所示:

/* Convert two bytes from an array to a 16-bit, unsigned value. */
int val = (b[idx] & 0xFF) << 8 | (b[idx + 1] & 0xFF);

在应用&运算符(和大多数其他运算符)之前,将 abyte扩展为 a int(甚至 a long,具体取决于上下文)。因此,有符号字节值0xFF被转换为有符号整数值0xFFFFFF

但通常在进行按位运算时,将每个字节视为无符号值的意图,因此byte 0xFF(-1) 应该只是int 0xFF(255)。掩蔽 with0xFF完成了这一点。

于 2009-08-27T23:10:21.240 回答