当前位置: 首页 > 面试题库 >

了解Java字节

文增
2023-03-14
问题内容

因此,在昨天的工作中,我不得不编写一个应用程序来计算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的二进制表示形式?


问题答案:

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

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

让我们以-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。



 类似资料:
  • 问题内容: 我经常卡在没有源的Java类文件中,并且试图理解我手头的问题。 请注意,反编译器是有用的,但在所有情况下都不足够… 我有两个问题 有哪些工具可用来查看Java字节码(最好从linux命令行中获得) 什么是熟悉Java字节码语法的良好参考 问题答案: 与其直接查看Java字节码(需要熟悉Java虚拟机及其操作),不如尝试使用Java反编译实用程序。反编译器将尝试从指定文件创建源文件。 该

  • 我有一个用mvn Exec:java运行的程序(我的主文件是用utf-8编码的,系统的默认字符集是windows-1252) 我不明白为什么第一次打印工作,根据文档getBytes使用给定的字符集将字符串编码成字节序列,字符串构造函数通过使用平台的默认字符集解码指定的字节数组来构造新的字符串

  • 问题内容: 我想了解如何将带符号的数字转换为无符号的数字。 可以说我有这个: 为了使其无符号,我必须选择“更大”的数据类型“ short”,并应用值为0x00ff的AND运算符。 为什么使数字无符号? 问题答案: Java实际上没有无符号原语。 值127实际上由“ 01111111”表示,第一位是符号(0为正)。 一个无符号字节将能够保存0到255的值,但是127是有符号字节的最大值。由于一个字节

  • 问题内容: 为了确定Java堆大小,我使用了以下命令: 但是,我无法理解ErgoHeapSizeLimit,HeapSizePerGCThread,InitialHeapSize,LargePageHeapSizeThreshold,MaxHeapSize等的含义。有人可以简要解释一下这些术语。其实我是Java的新手 其实我需要确定我的机器可以分配给进程的堆大小吗?因为我的应用程序之一需要以下参数

  • 问题内容: 有以下代码: 并有输出: 为什么它打印八次而不是“ y”。遇到Java 时如何调用? 问题答案: 在这里您正在捉住,而不是在这种情况下您的程序会崩溃。 如果您尝试此代码(修改为添加静态计数器) 输出量 因此,它已进行了6869次(不同运行次数的更改),并打印了最后一个值。如果您只是像以前那样打印,则可能是输出被缓冲而不被刷新,因为它不是。 更新资料 在内部调用该缓冲。您不会丢失缓冲区中

  • 在忽略Java更新一段时间之后,我现在想从我在某处找到的有点阴暗的Java 10.0.2运行时转移到Java 13。事实证明,在Java 8之后,Oracle停止了“单片”JRE哲学,对于我关于如何进行部署的问题,我似乎找不到任何明确的答案。 以下是我认为保持不变的内容: IDE(eclipse)工作流基本保持不变 现在,我无法理解的棘手部分来了:在其他机器上的部署 创建一个module-info