读取字节,转换为整数

时间:2017-11-25 02:27:48

标签: java elf

ELF_64_word 的规范声明此类型的变量长度为四个字节且无符号整数

Table 1. ELF-64 Data Types
Name         Size Alignment       Purpose
Elf64_Addr    8      8      Unsigned program address
Elf64_Off     8      8      Unsigned file offset
Elf64_Half    2      2      Unsigned medium integer
Elf64_Word    4      4      Unsigned integer
Elf64_Sword   4      4      Signed integer
Elf64_Xword   8      8      Unsigned long integer
Elf64_Sxword  8      8      Signed long integer
unsigned char 1      1      Unsigned small integer

我有一个字节序列,其中我找到了一些Elf64_word的四个字节。我的问题是如何在Java中将这些字节读取为无符号整数?

由于

2 个答案:

答案 0 :(得分:1)

将它们作为int(带符号,4个字节)读取,并在计算时将其转换为long:

int sint = ...

long uint = Integer.toUnsignedLong(sint);

请注意Integer有许多无符号处理函数

  • compareUnsigned(n,m)
  • parseUnsignedInt - 非常适合十六进制
  • toUnsignedString

答案 1 :(得分:0)

对于大多数操作(加法,减法,乘法,左移),您可以将无符号64位整数视为long s。 Java逐渐得到更好的无符号整数支持:

大多数64位ELF值实际上并不需要64位(因为只有极少数64位架构支持完整的地址范围),并且格式将它们视为不透明的,您不必执行任何算法他们,所以long作为一个容器就好了。在实际需要算术的情况下,您甚至可以使用非负int来代替,因为如果这些数量超过Integer.MAX_VALUE,则生成的ELF二进制文件将大到几千兆字节。

将字节解析为long的最有效方法可能是ByteBuffer.getLong()或其变体之一。