所以在昨天的工作中,我不得不编写一个应用程序来计算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.
| 归档时间: |
|
| 查看次数: |
10317 次 |
| 最近记录: |