3

末尾が任意のファイルタイプのファイルを読み取ろうとしており、その16進値からPNGファイルかどうかを判断しています。

これまでに2つの異なるパスを試しましたが、どれも機能していません。

  • 最初の8つの16進値によって正しいヘッダーがあるかどうかが決まるため、最初に最初の16文字を読み取りました。それから私はそれを分離しようとします、そしてそれがここの他のスレッドで提示されたのと同じように16進値を読みます。
  • もう1つは、最初の2つの値を読み取り、それが16進値であるかどうかを判断して、機能しているかどうかを確認したいだけです。そうではない。

コード:

int IS_PNG_FILE(char *name)
{
    FILE *dat = fopen (name, "rt");
    if (dat == NULL) return 1;
    int data_point;

    char buf[16], a[16];
    fgets(buf, 16, dat);
    printf("%s\n", buf);
    int i, b;
    for (i=0; i<16; i++)
    {
        sscanf(&buf[i], "%2x", &b);
        a[i] = b;
        i += 2;
    }
    printf("%d\n", a);


    fscanf(dat, "%2x", &data_point);
    printf("%d\n", data_point);

    fclose(dat);
    return 0;
}
4

1 に答える 1

5

ファイルからバイナリバイトを読み取るには、次を使用しますfread

関数 fread() は、stream が指すストリームから nmemb 要素のデータを読み取り、各 size バイトの長さを、ptr で指定された場所に格納します。

何かのようなもの:

unsigned char head[8];

fread(head, sizeof(head), 1, dat);

戻り値をチェックして、実際に 8 バイトが読み取られたことを確認できます。

次に、memcmp を使用して比較します

unsigned char signature[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};

if (!memcmp(signature, head, 8))
{
    ...
}
于 2013-03-19T21:58:43.763 に答える