因此,在昨天的工作中,我不得不编写一个应用程序来计算AFP文件中的页数。因此,我整理了我的MO:DCA规范PDF,找到了结构化字段BPG (Begin Page)及其3个字节的标识符。该应用程序需要在AIX机器上运行,所以我决定用Java编写它。
BPG (Begin Page)
为了获得最大效率,我决定读取每个结构化字段的前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使用带符号的字节。
BPG
我进行了一些谷歌搜索,发现了很多有用的信息。当然,最有用的是按位&进行操作0xff以获得无符号int值的指令。对于我来说,获得一个可用于计算要跳过的字节数的长度是必要的。
&
0xff
我现在知道在128,我们从-128开始倒数。我想知道的是按位运算在这里如何工作-更具体地说,我如何得出负数的二进制表示形式。
如果我&正确理解按位,则结果等于一个仅设置两个数字的公共位的数字。因此,假设byte b = -128,我们将有:
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
实际发生的事情如下:您的文件有一个带value的字节10111000。当解释为无符号字节(可能是您想要的)时,它是88。
在Java中,当将此字节用作int时(例如,由于read()返回int或由于隐式提升),它将被解释为带符号的字节,并将其符号扩展为11111111 11111111 11111111 10111000。这是一个值为-72的整数。
read()
11111111 11111111 11111111 10111000
通过与0xff运算,您将只保留最低的8位,因此您的整数现在00000000 00000000 00000000 10111000为88。
00000000 00000000 00000000 10111000