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中将这些字节读取为无符号整数?
由于
答案 0 :(得分:1)
将它们作为int
(带符号,4个字节)读取,并在计算时将其转换为long:
int sint = ...
long uint = Integer.toUnsignedLong(sint);
请注意Integer有许多无符号处理函数
答案 1 :(得分:0)
对于大多数操作(加法,减法,乘法,左移),您可以将无符号64位整数视为long
s。 Java逐渐得到更好的无符号整数支持:
Long.compareUnsigned(long, long)
(虽然==
和!=
显然适用于(平等)检查)Long.divideUnsigned(long, long)
Long.remainderUnsigned(long, long)
Long.toUnsignedString(long)
和Long.toUnsignedString(long, int)
>>
),请务必使用逻辑右移(>>>
)。大多数64位ELF值实际上并不需要64位(因为只有极少数64位架构支持完整的地址范围),并且格式将它们视为不透明的,您不必执行任何算法他们,所以long
作为一个容器就好了。在实际需要算术的情况下,您甚至可以使用非负int
来代替,因为如果这些数量超过Integer.MAX_VALUE
,则生成的ELF二进制文件将大到几千兆字节。
将字节解析为long
的最有效方法可能是ByteBuffer.getLong()
或其变体之一。