为什么值从inptr变成一个不同于fgetc(inptr)给出的值的数组?

时间:2012-12-13 07:20:39

标签: c arrays file-io gdb

我正在尝试迭代.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到头,然后在gdb中打印头,我得到疯狂的垃圾值,并且do-while变成无限循环。我不知道发生了什么。感谢。

1 个答案:

答案 0 :(得分:1)

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

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

您的代码无法找到标题。

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