java - 了解 Java 字节

标签 java binary byte

所以昨天在工作中,我不得不编写一个应用程序来计算 AFP 文件中的页数。因此,我清除了我的 MO:DCA 规范 PDF 并找到了结构化字段 BPG (Begin Page) 及其 3 字节标识符。该应用程序需要在 AIX 机器上运行,所以我决定用 Java 编写它。

为了获得最大效率,我决定读取每个结构化字段的前 6 个字节,然后跳过该字段中的剩余字节。这会让我:

0: Start of field byte
1-2: 2-byte length of field
3-5: 3-byte sequence identifying the type of field

所以我检查字段类型,如果它是 BPG,我会增加一个页面计数器,如果不是,我不会。然后我跳过字段中剩余的字节而不是通读它们。在这里,在跳过(实际上是在字段长度)中,我发现 Java 使用带符号的字节。

我用谷歌搜索了一下,发现了很多有用的信息。当然,最有用的是对 0xff 按位执行 & 以获得 unsigned int 值的指令。这对于我获得可用于计算要跳过的字节数的长度是必要的。

我现在知道在 128 处,我们从 -128 开始倒数。我想知道这里的按位运算是如何工作的——更具体地说,我是如何得出负数的二进制表示形式的。

如果我正确理解按位 &,您的结果等于一个数字,其中只设置了两个数字的公共(public)位。所以假设 byte b = -128,我们会:

b & 0xff // 128

1000 0000-128
1111 1111 255
---------
1000 0000 128

那么对于 -128,我如何得出 1000 0000?我如何获得不太明显的二进制表示形式,例如 -72 或 -64?

最佳答案

为了获得负数的二进制表示,您需要计算二进制补码:

  • 获取正数的二进制表示
  • 反转所有位
  • 加一个

以-72为例:

0100 1000    72
1011 0111    All bits inverted
1011 1000    Add one

所以 -72 的二进制(8 位)表示是 10111000

您实际发生的情况如下:您的文件有一个值为 10111000 的字节。当解释为无符号字节(这可能是您想要的)时,这是 88。

在Java中,当这个字节被用作一个int时(例如因为read()返回一个int,或者因为隐式提升),它会被解释为一个带符号的字节,并且符号-扩展为 11111111 11111111 11111111 10111000。这是一个值为 -72 的整数。

通过与 0xff 进行与运算,您只保留最低的 8 位,因此您的整数现在是 00000000 00000000 00000000 10111000,即 88。

关于java - 了解 Java 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3845834/

相关文章:

java - 无图像图标显示

c++ - 类型位长度和特定于体系结构的实现

c - objcopy 生成的原始二进制文件太大

java - 转换具有文本初始化的文件后,我的字节数组充满零的原因是什么?

c - 如何将字节数组转换为整数?

java - 在 maven 本地仓库中看不到 sikuli-java lib

java - 处理覆盖范围之外生成的坐标

java - 使用 Iterator 时出现 ConcurrentModificationException

python - 为什么这个二进制文件的大小是相等的,尽管它们不应该相等?

go - 在go中将3个字节转换为int?