理解Java字节

Bri*_*haw 8 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
Run Code Online (Sandbox Code Playgroud)

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

我做了一些谷歌搜索,发现了很多有用的信息.最有用的,当然,是做一个按位指令&0xff获得无符号整型值.这对我来说是必要的,以获得可用于计算要跳过的字节数的长度.

我现在知道,在128,我们从-128开始向后计数.我想知道的是按位运算在这里是如何工作的 - 更具体地说,我是如何得到负数的二进制表示.

如果我&正确理解了bitwise ,你的结果等于只设置了两个数字的公共位的数字.所以假设byte b = -128,我们会:

b & 0xff // 128

1000 0000-128
1111 1111 255
---------
1000 0000 128
Run Code Online (Sandbox Code Playgroud)

那么我怎样才能到达1000 0000 -128?如何得到像-72或-64这样不太明显的二进制表示?

Gro*_*uez 18

为了获得负数的二进制表示,你计算两个补码:

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

我们以-72为例:

0100 1000    72
1011 0111    All bits inverted
1011 1000    Add one
Run Code Online (Sandbox Code Playgroud)

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

实际发生的是以下内容:您的文件有一个带有值的字节10111000.当解释为无符号字节(可能是你想要的)时,这是88.

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

通过AND 0xff运算只保留最低的8位,所以你的整数现在00000000 00000000 00000000 10111000是88.

  • 这正是我所追求的,非常感谢你.这就是我喜欢Stackoverflow的原因. (4认同)