メモリ内の特定のアドレスからCでDWORD、WORD、BYTEを読み取る方法を誰かに説明してもらえますか?
たとえば、MapViewOfFile() 関数を使用して返されるベース アドレス、C を使用して連続する BYTE、WORD、または DWORD を読み取るにはどうすればよいですか?
ありがとう。
4 に答える
あなたの質問には基本的に2つの部分があります:
メモリ内の特定のアドレスから C
DWORD
で ,WORD
,を読み取る方法を誰かに説明してもらえますか?BYTE
それは簡単ですが、おそらくあなたが望むものではないでしょう。アドレスを目的の型のポインターにキャストするだけです。
DWORD x = *((DWORD *)address);
たとえば、関数を使用して返されるベース アドレス、連続した、、またはC を使用して
MapViewOfFile()
読み取るにはどうすればよいですか?BYTE
WORD
DWORD
それも悪くない。
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
あります。例:DWORD
WORD
BYTE
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 */
それが役立つことを願っています。
MapViewOfFile
LPVOID
は( a と同等の) を返すvoid *
ため、他のポインタと同じように読み取ることができます。