メモリ内の特定のアドレスからCでDWORD、WORD、BYTEを読み取る方法を誰かに説明してもらえますか?
たとえば、MapViewOfFile() 関数を使用して返されるベース アドレス、C を使用して連続する BYTE、WORD、または DWORD を読み取るにはどうすればよいですか?
ありがとう。
4 に答える
あなたの質問には基本的に2つの部分があります:
メモリ内の特定のアドレスから C
DWORDで ,WORD,を読み取る方法を誰かに説明してもらえますか?BYTEそれは簡単ですが、おそらくあなたが望むものではないでしょう。アドレスを目的の型のポインターにキャストするだけです。
DWORD x = *((DWORD *)address);たとえば、関数を使用して返されるベース アドレス、連続した、、またはC を使用して
MapViewOfFile()読み取るにはどうすればよいですか?BYTEWORDDWORDそれも悪くない。
void*fromを取得しMapViewOfFile、単にキャストするか、適切なポインター型に割り当てるだけで、配列のように使用できます。DWORD *p = MapViewOfFile(...); DWORD x = p[1]; // second DWORD of the mapped file
使用しているデータ型に合わせてアドレスが適切に整列されていると仮定すると、これは重要です。一部のアーキテクチャでは、「整列されていない」アドレスにアクセスすることは無効です。
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あります。例:DWORDWORDBYTE
DWORD *dword_ptr = reinterpret_cast<DWORD *>(address);
MapViewOfFile()LPVOIDの typedef を返しますvoid*。キャストが必要になります。
最も簡単な方法は、一度に 1 バイトずつ読み取ることです。ここでは、何らかのパフォーマンス要件があるかどうかを指定していません (また、プラットフォーム、アーキテクチャなども指定していません)。
注: 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 */
それが役立つことを願っています。
MapViewOfFileLPVOIDは( a と同等の) を返すvoid *ため、他のポインタと同じように読み取ることができます。