gpt4 book ai didi

java - char* (Array) 强制转换为 unsigned long + 1?

转载 作者:搜寻专家 更新时间:2023-11-01 01:49:56 26 4
gpt4 key购买 nike

我正在尝试将一些 C 代码移植到 Java,但是我一直在努力弄清楚这些代码行的作用。

注意:rawEntrychar* 类型,看起来是一个 12 字节长的分配

char *rawEntry = (char*)malloc(0x000c);

unsigned long *l;
unsigned long offset;

// ...

l = (unsigned long*) rawEntry + 1;
offset = ntohl(*l);

据我所知,它采用数组的前四项,并将它们放在一起形成一个 long,但是我在 java 中的尝试并不成功。

offset = (rawEntry[0] << 24) +
(rawEntry[1] << 16) +
(rawEntry[2] << 8) +
(rawEntry[3]) +
1;

当出现以下数组时,

1 0 0 0 0 0 0 0 0 0 11 -38

C代码输出3034作为偏移量
我的 Java 代码输出 16777217,如果我翻转字节序则输出 1

最佳答案

这个表达式

l = (unsigned long*) rawEntry + 1;

rawEntry 转换为指向系统上大小为 8 字节的类型的指针。之后,加上1就是加8个字节,所以实际的转换是这样的:

offset = (Byte.toUnsignedInt(rawEntry[ 8]) << 24) +
(Byte.toUnsignedInt(rawEntry[ 9]) << 16) +
(Byte.toUnsignedInt(rawEntry[10]) << 8) +
(Byte.toUnsignedInt(rawEntry[11]) << 0);

以下四个字节被解释为3034:

0 0 11 -38

您应该能够通过使用 ByteBuffer 进一步简化它:

int offset = ByteBuffer.wrap(rawEntry, 8, 4).getInt();

关于java - char* (Array) 强制转换为 unsigned long + 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40812558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com