cs50x pset4 recover:恢复50张JPEG,但是图像的一半或更少

时间:2018-04-22 11:06:45

标签: c cs50 recover

我的程序找到所有50个jpgs。但是,图像不完整'。有些是一半恢复,有些不到四分之一,有些只是完全灰色。当我打开一个jpeg时,它在打开时显示为灰色,以十六进制表示大多数是彩色像素,这没有任何意义。我试图从各个角度找到这个错误。

任何人都可以帮助我理解为什么我的图片已被损坏'

// 000.jpg
int j = 0;
// storing 000.jpg
char jpeg[8];
// buffer
unsigned char bf[512];
// FILE pointer
FILE *img = NULL;
// reading into memory card file
while(fread(bf, 512, 1, inptr) == 1)
{
    if (bf[0] == 0xff && bf[1] == 0xd8 && bf[2] == 0xff && (bf[3] & 0xf0) == 0xe0)
    {
        sprintf(jpeg, "%03i.jpg", j);
        img = fopen(jpeg, "w");
        do
        {
            fwrite(bf, 512, 1, img);
            fread(bf, 512, 1, inptr);
        }
        while(bf[0] != 0xff && bf[1] != 0xd8 && bf[2] != 0xff && (bf[3] & 0xf0) != 0xe0);
        fclose(img);
        j++;
        // fread is going to read it again
        fseek(inptr, -512, SEEK_CUR);
    }
}
fclose(inptr);
return 0;
}

1 个答案:

答案 0 :(得分:0)

确保将“ b”标志传递给fopen。例如:

fopen(jpeg, "wb");

否则,标准库将(通常无济于事)自动为您转换行尾(例如,在Windows中\ n变成\ r \ n),将其应用于二进制文件会导致损坏。

请参见documentation for fopen

  

使用上面的模式说明符,文件将作为文本文件打开。为了将文件打开为二进制文件,模式字符串中必须包含“ b”字符​​。