0

谁能解释我如何从内存中的特定地址读取 C 中的 DWORD、WORD、BYTE?
例如,使用 MapViewOfFile() 函数返回的基地址,如何使用 C 读取连续的 BYTE、WORD 或 DWORD?
谢谢。

4

4 回答 4

1

假设地址与您使用的数据类型适当对齐 - 这在某些架构中很重要,访问“未对齐”地址是无效的!

在 C 中:

void *address = MapViewOfFile(...);
DWORD *dword_ptr = (DWORD *)address; 
WORD  *word_ptr = (WORD *)address;
BYTE  *byte_ptr = (BYTE *)address; 

在 C++ 中,模式是相似的,但不是基本的 C 风格转换,您应该使用reinterpret_cast<type*>(address), where typeis DWORD, WORD,BYTE等。例如:

DWORD *dword_ptr = reinterpret_cast<DWORD *>(address); 
于 2013-04-30T23:02:45.940 回答
1

MapViewOfFile()返回LPVOID它的 typedef void*。你需要一个演员表。

最简单的做法是一次读取一个字节。您没有指定此处是否有任何类型的性能要求(也没有指定您的平台、架构等),所以我假设“一次一个字节”是可以的。

注意:WORD 定义为短,在 Win32 中应为 16 位。DWORD 是一个 int,在 Win32 中应该是 32 位。

LPVOID pvAddr= MapViewOfFile(...);

BYTE* pBytes= (BYTE*)pvAddr;

BYTE firstByte= pBytes[0]; /* copy first byte */

WORD w;
memcpy(&w, pBytes+1, 2); /* copy the next two bytes */

DWORD dw;
memcpy(&dw, pBytes+3, 4); /* copy the next 4 bytes */

希望有帮助。

于 2013-04-30T23:03:23.540 回答
1

那么你的问题基本上有两个部分:

  1. 任何人都可以解释我如何从内存中的特定地址读取 C 中的DWORD,WORD​​ ,吗?BYTE

    这很容易,但可能不是您想要的,您只需将地址转换为所需类型的指针。

    DWORD x = *((DWORD *)address);
    
  2. 例如,使用MapViewOfFile()函数返回的基地址,如何读取连续BYTEWORD, 或DWORD使用 C ?

    这也不算太糟糕。您得到一个void*from MapViewOfFile,只需将其强制转换或将其分配给适当的指针类型,然后您就可以像数组一样使用它:

    DWORD *p = MapViewOfFile(...);
    DWORD x = p[1]; // second DWORD of the mapped file
    
于 2013-04-30T23:03:25.010 回答
0

MapViewOfFile返回 an LPVOID(相当于 a void *),因此可以像任何其他指针一样读取它。

于 2013-04-30T23:02:35.703 回答