1

独自のアドレス空間から特定のメモリアドレスにあるバイトを読み取るプログラムを C で作成しました。

それはこのように動作します:

  1. まず、ファイルから DWORD を読み取ります。
  2. 次に、この DWORD をメモリ アドレスとして使用し、現在のプロセスのアドレス空間でこのメモリ アドレスから 1 バイトを読み取ります。

コードの要約は次のとおりです。

FILE *fp;
char buffer[4];

fp=fopen("input.txt","rb");

// buffer will store the DWORD read from the file

fread(buffer, 1, 4, fp);

printf("the memory address is: %x", *buffer);

// I have to do all these type castings so that it prints only the byte example:
// 0x8b instead of 0xffffff8b

printf("the byte at this memory address is: %x\n", (unsigned)(unsigned char)(*(*buffer)));

// And I perform comparisons this way

if((unsigned)(unsigned char)(*(*buffer)) == 0x8b)
{
    // do something
}

このプログラムは動作しますが、特定のメモリ アドレスからバイトを読み取って比較を実行する別の方法があるかどうか知りたいですか? 毎回、すべての型キャストを記述する必要があるためです。

また、次の構文を使用してファイルにバイトを書き込もうとすると、次のようになります。

// fp2 is the file pointer for the output file
fwrite(fp2, 1, 1, (unsigned)(unsigned char)(*(*buffer)));

警告が表示されます:

test.c(64) : warning C4047: 'function' : 'FILE *' differs in levels of indirectio
n from 'unsigned int'
test.c(64) : warning C4024: 'fwrite' : different types for formal and actual para
meter 4

ありがとう。

4

3 に答える 3

1

示されているように、C 言語の共用体構造を使用して、型のエイリアスを表すことができます。

typedef union {
      char char[4];
      char *pointer;
   } alias;

alias buffer;

これは 32 ビット アーキテクチャを前提としています (4コンパイル時に を調整できますが、fread()バイト カウントも変更する必要があります)。

*(buffer.pointer)次に、 を使用してメモリ ロケーションの内容を参照するだけです。

あなたの質問から、アプリケーションは明確ではなく、テクニックはエラーが発生しやすいようです。物事が変化するとき、メモリ内のアドレスの移動をどのように考慮しますか? リンカ マップを使用して位置のシンボリック情報を抽出し、絶対アドレスを回避することには、いくつかのポイントがある場合があります。

于 2013-09-09T19:20:00.800 に答える
0
    fp=fopen("input.txt","rb");

ファイルの拡張子は .txt で、バイナリ ファイルとして読み取ろうとしています。それに応じてファイル名を付けてください。Windows の場合は、バイナリ ファイルに .bin 拡張子の名前を付けます。Linux ではファイル拡張子は関係ありません。

    // buffer will store the DWORD read from the file

    fread(buffer, 1, 4, fp);

4 バイトを読み取りたい場合は、以下に示すように、unsinged int 変数を宣言し、それに 4 バイトを読み取ります。

    fread(&uint, 1, 4, fp);

なぜ文字配列を使用するのですか? それは正しくありません。

    printf("the memory address is: %x", *buffer);

ここで何をしようとしていますか? buffer は const char へのポインターであり、上記のステートメントは配列の最初の文字の 16 進値を出力します。上記のステートメントは次と等しい

   printf("the memory address is: %x", buffer[0]);

   (*(*buffer)

これはどのように機能していますか?コンパイラの警告やエラーはありませんか? それは Windows ですか、それとも Linux ですか? (*buffer) は char であり、適切にキャストしない限り、逆参照するとスローされ、エラーが発生するはずです。

于 2013-09-11T16:56:51.340 に答える