任何人都可以解释我如何从内存中的特定地址读取C中的DWORD,WORD,BYTE吗?
例如,使用MapViewOfFile()函数返回的基地址,如何使用C读取连续的BYTE,WORD或DWORD?
感谢。
答案 0 :(得分: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)
,其中type
是DWORD
,WORD
,{{ 1}}等等。例如:
BYTE
答案 1 :(得分:1)
MapViewOfFile()
返回LPVOID
,这是void*
的typedef。你需要演员。
最简单的方法是一次读取一个字节。你没有在这里指定是否存在任何类型的性能要求(也没有指定你的平台,拱形等),所以我假设“一次一个字节”是可以的。
注意:WORD定义为short,在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 */
希望有所帮助。
答案 2 :(得分:1)
那么你的问题基本上有两个部分:
有人可以解释我如何从内存中的特定地址读取C中的DWORD
,WORD
,BYTE
吗?
这很容易,但可能不是你想要的,你只需将地址转换为所需类型的指针。
DWORD x = *((DWORD *)address);
例如,使用MapViewOfFile()
函数返回的基地址,如何使用C读取连续的BYTE
,WORD
或DWORD
?
这也不算太糟糕。您从void*
获得MapViewOfFile
,只需将其转换为适当的指针类型,然后将其用作数组:
DWORD *p = MapViewOfFile(...);
DWORD x = p[1]; // second DWORD of the mapped file
答案 3 :(得分:0)
MapViewOfFile
会返回LPVOID
(相当于void *
),因此可以像其他任何pointer一样阅读。