恢复的图像不匹配:CS50

问题描述 投票:0回答:1

我正在做 CS50 课程的Recover作业。

收到错误:恢复的图像不匹配(来自 CS50 错误检查器)。换句话说,我成功恢复了 50/50 JPG,但它们都是空白的

似乎无法弄清楚问题出在哪里。

尝试重构一下代码,但老实说我很茫然。我知道它一定与处理多块文件有关,但也许我错过了一些更基本的东西。 CS50 是我第一次涉足 C,因此我希望尽可能详细地阐述。

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

int main(int argc, char *argv[])
{
    if (argc != 2) {
        printf("Please add exactly one command line argument!");
        return 1;
    }

    FILE *card = fopen(argv[1], "r");
    char *filename = malloc(8);
    FILE *img = NULL;
    int numOfImgs = 0;

    if (card == NULL)
    {
        printf("Could not access memory card.\n");
        return 1;
    }

    uint8_t buffer[512];
    while (fread(buffer, 1, 512, card) == 512)
    {
        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0) {

            if (img == NULL) {
                sprintf(filename, "%03i.jpg", numOfImgs);
                img = fopen(filename, "w");
                fwrite(buffer, 1, 512, img);
            }
            else {
                fclose(img);
                sprintf(filename, "%03i.jpg", numOfImgs);
                img = fopen(filename, "w");
                fwrite(buffer, 1, 512, img);
            }
            numOfImgs++;
        }
    }

    fclose(img);
    fclose(card);
    free(filename);
    return 0;
}
c cs50 recover
1个回答
0
投票

作业陈述如下:

当然要认识到,JPEG 可以跨越连续的块。否则,任何 JPEG 都不能大于 512 B。

您似乎错误地认为 JPEG 文件永远不会包含超过一个 512 字节的块。

您仅将每个恢复文件的前 512 字节块写入输出 JPEG 文件。您正在丢弃所有后续块,这是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.