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 循环 fwrite 到 header,然后在 gdb 中打印 header,我会得到疯狂的垃圾值,并且 do-while 变成一个无限循环。我不知道发生了什么。谢谢。

4

1 回答 1

1

即使原始文件存在,您的代码也可能无法在 RAW 文件中找到 JPEG 标头,前提是标头之前的原始部分中有 0xff。例如,如果文件包含:

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

您的代码不会找到标题。

相反,您应该逐字节读取文件(记住最后三个读取字节)并将这些字节与 JPEG 标头的常量进行比较。

于 2012-12-13T08:43:56.013 回答