我试图遍历一个.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循环开始之前打印了4次fgetc(inptr),那么我得到的肯定是0xffd8ffe0如果我让do while循环fwrite到header,然后在gdb中打印header,我会得到疯狂的垃圾值,do while变成一个无限循环我不知道发生了什么事谢谢。

最佳答案

即使JPEG头在原始文件中,如果头之前的原始部分有一个0xff,代码也可能无法在原始文件中找到它例如,如果文件包含:

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

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

09-06 20:26