0

メモリ内の特定のアドレスからCでDWORD、WORD、BYTEを読み取る方法を誰かに説明してもらえますか?
たとえば、MapViewOfFile() 関数を使用して返されるベース アドレス、C を使用して連続する BYTE、WORD、または DWORD を読み取るにはどうすればよいですか?
ありがとう。

4

4 に答える 4

1

あなたの質問には基本的に2つの部分があります:

  1. メモリ内の特定のアドレスから CDWORDで , WORD,を読み取る方法を誰かに説明してもらえますか?BYTE

    それは簡単ですが、おそらくあなたが望むものではないでしょう。アドレスを目的の型のポインターにキャストするだけです。

    DWORD x = *((DWORD *)address);
    
  2. たとえば、関数を使用して返されるベース アドレス、連続した、、またはC を使用してMapViewOfFile()読み取るにはどうすればよいですか?BYTEWORDDWORD

    それも悪くない。void*fromを取得しMapViewOfFile、単にキャストするか、適切なポインター型に割り当てるだけで、配列のように使用できます。

    DWORD *p = MapViewOfFile(...);
    DWORD x = p[1]; // second DWORD of the mapped file
    
于 2013-04-30T23:03:25.010 に答える
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あります。例:DWORDWORDBYTE

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

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 */

それが役立つことを願っています。

于 2013-04-30T23:03:23.540 に答える
0

MapViewOfFileLPVOIDは( a と同等の) を返すvoid *ため、他のポインタと同じように読み取ることができます。

于 2013-04-30T23:02:35.703 に答える