-1

我有一些部分源代码正在尝试完全重建(不要问其余的在哪里,它不可用),我目前被困在一个缺失的方法“endianconvert”

我对c ++没有太多经验,所以我希望这里有人可以帮助我。这是函数调用

endianConvert (reinterpret_cast<DWORD *>(pData+dwClassOffset), sizeof (PageTable) >> 2);

pData 是一个 BYTE 数组,其中填充了文件的内容

BYTE * pData = new BYTE[l];

dwclassoffset 是文件中的当前位置

DWORD dwClassOffset = 0;

PageTable 是一个包含多个 DWORD 变量的类。

看起来我需要在 BYTE 数组中交换几个 DWORDS 的字节序,但我不知道如何开始实现这个,非常感谢任何帮助。

4

2 回答 2

3

该函数很可能endianConvert将文件中的 32 位整数值转换为内存中的 32 位整数值。要实现它,您应该知道文件中使用了哪个字节序以及目标机器上使用了哪个字节序。如果它们的字节序相同,那么endianConvert应该让数组保持原样,否则它应该做类似的事情

uint32_t dw = *dword_ptr;
// flip bytes
dw = (dw >> 24) | ((dw >> 8) & 0xff00) | ((dw << 8) & 0xff0000) | (dw << 24);
*dword_ptr = dw;

对于数组中的每个 DWORD。

于 2013-05-18T14:37:57.090 回答
1

该表达式将对象的大小(以字节为单位)除以 4,这为您提供了要转换的 4 字节字的数量,因此从一个执行多次>> 2操作的函数开始:

void endianConvert(DWORD* data, size_t count)
{
    for (size_t n = 0; n < count; ++n)
       /* convert data[n] */;
}

现在您需要能够交换单个 DWORD 的字节顺序,这非常简单:

DWORD& d = data[n];
DWORD b1 = d & 0x000000ff;
DWORD b2 = d & 0x0000ff00;
DWORD b3 = d & 0x00ff0000;
DWORD b4 = d & 0xff000000;
d = (b1 << 24) | (b2 << 8) | (b3 >> 8) | (b4 >> 24);

提取每个字节,然后将其移动到它在另一个字节序中的位置,然后将字节组合在一起。

于 2013-05-18T14:50:07.670 回答