Мои восстановленные IMG не соответствуют оригиналу в восстановленном CS50

Проблема в том, чтобы восстановить некоторые файлы JPG из файла .raw.

когда я запускаю check50, я получаю «восстановленные img не совпадают».

:) recovery.c существует.
:) recovery.c компилируется.
:) обрабатывает отсутствие криминалистического образа
:( recovers 000.jpg правильно восстановленное изображение не совпадает
:( восстанавливает промежуточные изображения правильно восстановленное изображение не совпадение
:( восстанавливает 015.jpg правильно 015.jpg не найден

Я действительно очень старался определить проблему, и каждый раз, когда мне не удается определить, в чем проблема, я надеюсь, что кто-то сможет и даст мне мирный совет.

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

int main(int argc, char *argv[]){

if(argc != 2){

     fprintf(stderr, "Usage: ./recover image");
    return 1;
}

//open file

FILE *inptr = fopen(argv[1], "r");
if (inptr == NULL){

    fprintf(stderr, "Could not open %s.\n", argv[1]);
    return 2;
}


int foundjpg = 0;
char filename[10];
int x=1;

//repeat until end of the card
while(x == 1){

    //buffer
    unsigned char buf[512];
    x = fread(buf, 512, 1, inptr);
    //read into buffer
    fread(buf, 512, 1, inptr);
    FILE *jpg = fopen(filename, "w");

    //start of a new jpg?
    if(buf[0]== 0xff  && buf[1] == 0xd8  && buf[2] == 0xff && (buf[3] & 0xf0) == 0xe0 ){


        if(jpg != NULL){// yes i found before

            fclose(jpg);
            sprintf(filename, "%03i.jpg" ,foundjpg );
            foundjpg++;
            jpg = fopen(filename, "w");


        }
        else{
            sprintf(filename, "%03i.jpg" ,foundjpg );
            jpg = fopen(filename , "w");
            foundjpg++;

        }
    }
    //already found a jpg?
    if(jpg != NULL && foundjpg > 0){

        fwrite(buf, 1, 512, jpg);

    }

}


fclose(inptr);

// success
return 0;

}


person AbdElRahman Salim    schedule 24.09.2017    source источник
comment
В сети обмена стеками есть специальный сайт для CS50.   -  person StoryTeller - Unslander Monica    schedule 24.09.2017


Ответы (1)


Порядок действий весьма запутан и приводит к ошибкам. Например:

  • filename не инициализируется при первом использовании.
  • Вы увеличиваете счетчик foundjpg после того, как используете его для создания имени файла, что в вашей программе означает, что второе изображение называется 01.jpg. Все индексы изображений сдвинуты на единицу, а последний отсутствует.
  • Когда байты идентификатора не идентифицируют действительный jpg, новая запись не читается, и ваш цикл никогда не заканчивается.

Вам следует реорганизовать свой код так, чтобы он выполнял одно за другим естественным образом. Программа может выглядеть так:

  • Проверить аргументы командной строки
  • Откройте необработанный файл
  • Main loop:
    • Read fixed-size block. If it can't be read, exit the loop
    • Check if first bytes identify a jpg and if so:
      • Create file name
      • Откройте файл jpg для записи
      • Записать блок и закрыть файл jpg
      • Счетчик блока приращения
  • Закройте необработанный файл

Вы должны решить, как вы справляетесь с ошибками. Вы просто пропускаете ошибочные блоки или прерываете программу?

Также неясно, все ли изображения имеют длину 512 байт, что кажется маловероятным. Возможно, вам нужно прочитать фактический размер изображения из заголовка, а затем скопировать все изображение.

person M Oehm    schedule 24.09.2017