谁能解释我如何从内存中的特定地址读取 C 中的 DWORD、WORD、BYTE?
例如,使用 MapViewOfFile() 函数返回的基地址,如何使用 C 读取连续的 BYTE、WORD 或 DWORD?
谢谢。
4 回答
假设地址与您使用的数据类型适当对齐 - 这在某些架构中很重要,访问“未对齐”地址是无效的!
在 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 type
is DWORD
, WORD
,BYTE
等。例如:
DWORD *dword_ptr = reinterpret_cast<DWORD *>(address);
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 */
希望有帮助。
那么你的问题基本上有两个部分:
任何人都可以解释我如何从内存中的特定地址读取 C 中的
DWORD
,WORD
,吗?BYTE
这很容易,但可能不是您想要的,您只需将地址转换为所需类型的指针。
DWORD x = *((DWORD *)address);
例如,使用
MapViewOfFile()
函数返回的基地址,如何读取连续BYTE
的WORD
, 或DWORD
使用 C ?这也不算太糟糕。您得到一个
void*
fromMapViewOfFile
,只需将其强制转换或将其分配给适当的指针类型,然后您就可以像数组一样使用它:DWORD *p = MapViewOfFile(...); DWORD x = p[1]; // second DWORD of the mapped file
MapViewOfFile
返回 an LPVOID
(相当于 a void *
),因此可以像任何其他指针一样读取它。