小编典典

了解Java字节

java

因此,在昨天的工作中,我不得不编写一个应用程序来计算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以获得无符号int值的指令。对于我来说,获得一个可用于计算要跳过的字节数的长度是必要的。

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

如果我&正确理解按位,则结果等于一个仅设置两个数字的公共位的数字。因此,假设byte b = -128,我们将有:

b & 0xff // 128

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

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


阅读 219

收藏
2020-11-13

共1个答案

小编典典

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

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

让我们以-72为例:

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

因此,-72的二进制(8位)表示形式是10111000

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

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

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

2020-11-13