1

これが私がやろうとしていることです。ファイルを開き、最初の 2 バイト (2 文字) を読み取り、それを 2 文字の文字列と比較する短い C コードを作成しました。これは、ファイルの種類を識別するのに役立ちます (最初の 2 バイトをファイルの署名と呼びましょう)。

ファイルから 2 バイトを読み取ったら、定義済みの署名と比較し、それに基づいてファイルの種類を出力します。

コード:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
FILE *fp;
char signature[2];

if(argc!=2)
{
printf("usage: fileio.c <filename>\n");
exit(1);
}

if((fp=fopen(argv[1],"r"))!=NULL)
{
fscanf(fp,"%c %c", &signature[0], &signature[1]);
printf("%x %x\n",signature[0],signature[1]);
}

}

これを Windows プラットフォームの実行可能ファイルに対して実行すると、出力は 4a 5d と表示されます。これは MZ 署名であるためです。

今、私はこのようなことをしたい:

署名配列の 2 バイトを 0x4d5a と比較し、それらが等しい場合は、それが実行可能ファイルであることを出力します。

私が考えた別の方法は、文字列「MZ」と比較することでした。しかし、次に fscanf を使用してファイルから最初の 2 バイトを読み取り、それらを文字列に格納する必要があります。次に、「MZ」署名と比較します。

後で16進バイトで何らかの操作を実行する必要があるため、16進バイトを使用してそれを行うことができれば素晴らしいでしょう。

ありがとう。

4

2 に答える 2

1
#include <stdio.h>
#include <stdint.h>

int main(int argc, char *argv[]){
  FILE *fp;
  const char mz_sig[] =  {0x4d, 0x5a};
  char signature[2];

  fp=fopen(argv[1],"r");
  fscanf(fp,"%c %c", &signature[0], &signature[1]);
  printf("%x %x\n", signature[0], signature[1]);

  if (*(uint16_t*)signature == *(uint16_t*)mz_sig) {
    printf("match\n");
  }

  return 0;
}
于 2013-02-20T06:49:16.880 に答える
0

まず、ファイルをバイナリモードで開く必要があります("rb")。

fread読み取りに関しては、最初の2バイトを1つとして読み取りuint16_t、それを比較するために使用できます。

于 2013-02-20T06:42:34.887 に答える