Cra*_*art 4 c java arrays porting casting
我正在尝试将一些C代码移植到Java,但是我一直在努力弄清楚这些代码行的作用.
注意:rawEntry是类型的,char*并且看起来像是这样分配的12字节长
char *rawEntry = (char*)malloc(0x000c);
Run Code Online (Sandbox Code Playgroud)
unsigned long *l;
unsigned long offset;
// ...
l = (unsigned long*) rawEntry + 1;
offset = ntohl(*l);
Run Code Online (Sandbox Code Playgroud)
据我所知,它需要数组的前四项,并将它们组合在一起形成一个长的,但是我在java中的尝试并不成功.
offset = (rawEntry[0] << 24) +
(rawEntry[1] << 16) +
(rawEntry[2] << 8) +
(rawEntry[3]) +
1;
Run Code Online (Sandbox Code Playgroud)
当出现以下数组时,
1 0 0 0 0 0 0 0 0 0 11 -38
Run Code Online (Sandbox Code Playgroud)
C代码输出3034作为偏移量
My Java代码输出16777217,如果我翻转字节序则输出1
这个表达
l = (unsigned long*) rawEntry + 1;
Run Code Online (Sandbox Code Playgroud)
强制转换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);
Run Code Online (Sandbox Code Playgroud)
以下四个字节被解释为3034:
0 0 11 -38
Run Code Online (Sandbox Code Playgroud)
您应该能够通过以下方式进一步简化ByteBuffer:
int offset = ByteBuffer.wrap(rawEntry, 8, 4).getInt();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |