我试图遍历一个.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头的常量进行比较。