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

标签 java c arrays casting porting

我正在尝试将一些 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/

相关文章:

Java EE 6 程序安全性、glassfish 和 JDBC 领域

java - servlet 规范是否保证单线程初始化和内联 attributeChanged 事件?

python - 从 Python 执行 C 函数时防止 exit(1) 退出 Python

c - Node : Performance of Native Addon vs External Binary

c++ - c++如何在编译阶段处理未知大小的数组分配

Java - Objective C - 针对每个循环问题

java - 从 JSoup 中的 html 中删除 <div> 标签

c - 如何获取数组的算术序列(C)

javascript - 阵列未被识别

arrays - 在 Go 中打印数组值