2

.raw ファイルを反復処理して、jpeg が開始していることを示す 4 バイト (0xffd8ffe0 または 0xffd8ffe1) を探しています。

int junk = fgetc(inptr);
while (junk != 0xff)
    if (junk == EOF)
    {
        printf("Reached end of file.\n");
        printf("2\n");
        return 2;
    }
    else
    {
        junk = fgetc(inptr);
    }

0xff を見つけたら、fseek(inptr, -1, SEEK_CUR) を実行し、次のようにします。

while (feof(inptr) == 0)
{
    // declared write file outptr

    // write header
    char header[4];
    do
    {
        fread(&header, sizeof(char), 4, inptr);
        if (header[1-4] are 0xffd8ffe0 or 0xffd8ffe1)
            fwrite(&header, 1, 4, outptr);
    } while (header[1-4] are not 0xffd8ffe0 or 0xffd8ffe1);

GDB を使用していて、while ループが始まる前に fgetc(inptr) を 4 回出力すると、確かに 0xffd8ffe0 が返されます。do-while ループでヘッダーに書き込み、gdb でヘッダーを出力すると、おかしなジャンク値が得られ、do-while が無限ループになります。何が起こっているのかわかりません。ありがとう。

4

1 に答える 1

1

ヘッダーの前の raw 部分に 0xff がある場合、コードは RAW ファイルに JPEG ヘッダーがあったとしても、それを見つけられない可能性があります。たとえば、ファイルに次のものが含まれているとします。

0x00 0xff 0x00 0x00 0xff 0xd8 0xff 0xe0 <JPEG data>

あなたのコードはヘッダーを見つけません。

代わりに、ファイルをバイトごとに読み取り (最後の 3 つの読み取りバイトを記憶)、それらのバイトを JPEG ヘッダーの定数と比較する必要があります。

于 2012-12-13T08:43:56.013 に答える