jpg格式不正确,包含多个图像。谁能告诉我怎么了?“恢复”

时间:2019-07-09 15:19:17

标签: c cs50 recover

我正在研究CS50的PSET3恢复。我有一个“ card.raw”文件,其中的jpg在第一个之后依次排列。

练习的目的是“通过扫描512个字节来查找第一个jpg,并检查它是否是jpg的开头,然后向文件中添加下一个字节,直到找到下一个jpg开头,然后打开另一个文件并重复直到文件尾”。

图像无法正确生成,我不确定我的问题出在下面的代码中。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
    //check if program argument count is correct
    if ( argc != 2)
    {
        fprintf(stderr,"Usage: ./recover image\n");
        return(1);
    }

    char *infile = argv[1];    //Remember file name

    //open file for reading
    FILE *inptr = fopen(infile,"r");
    if (inptr == NULL)
    {
        fprintf(stderr, "Could not open %s.\n", infile);
        return(2);
    }

    typedef uint8_t BYTE;      //new name BYTE

    BYTE buffer[512];          // temporary  storage

    int counter = 0;           // image counter

    while (fread(buffer, 512, 1, inptr) == 1)
    {
        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
        {
            char filename[8];

            start:
            sprintf(filename,"%03i.jpg", counter);
            FILE *outptr = fopen(filename,"w");
            fwrite(buffer, 512, 1,outptr);

            //check next byte
             while (fread(buffer, 512, 1, inptr) == 1)
             {
                  if (buffer[0] != 0xff && buffer[1] != 0xd8 && buffer[2] != 0xff && (buffer[3] & 0xf0) != 0xe0)
                  {
                      fwrite(buffer, 512, 1,outptr);
                      printf("%i",counter);
                  }

                  //if next file starts
                  if(buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
                  {
                      counter++;
                      printf("%i",counter);
                      fclose(outptr);
                      goto start;
                  }
             }
             if (counter > 1)
             {
                 fclose(outptr);
             }
        }
    }
    fclose(inptr);
}

1 个答案:

答案 0 :(得分:0)

本来可以编写更好的代码,但是如果只是逻辑的话

if (buffer[0] != 0xff && buffer[1] != 0xd8 && buffer[2] != 0xff && (buffer[3] & 0xf0) != 0xe0)
                  {
                      fwrite(buffer, 512, 1,outptr);
                      printf("%i",counter);
                  }

这是错误的,应该是

if (!(buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0))
                  {
                      fwrite(buffer, 512, 1,outptr);
                      printf("%i",counter);
                  }

因为前一个也忽略了jpg的任何一部分,即前4个字节中的一个或多个字节等于IMG的开头,但不是全部。 谢谢大家的帮助。