Я застрял в этой проблеме:
Результат:
:) recovery.c существует.
:) recovery.c компилирует.
:) справляется с отсутствием криминалистического изображения
:) восстанавливает 000.jpg правильно
:) восстанавливает средние изображения правильно
:( восстанавливает 049.jpg правильно
восстановленное изображение не соответствует
Файл компилируется правильно, и все 50 файлов .jpg понятны, однако есть небольшая проблема с последним файлом (049.jpg: восстановленное изображение не совпадает), и я просто не могу выяснить причину.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(int argc, char *argv[])
{
// ensure 1 command-line argument:
if(argc != 2)
{
fprintf(stderr, "Usage: name of forensic image from which to recover JPEGs");
return 1;
}
// open the memory card file:
FILE *file = fopen(argv[1], "r");
if (!file)
{
fprintf(stderr, "Could not open %s.\n", argv[1]);
fclose(file);
return 2;
}
//fseek(file, 0, SEEK_SET);
unsigned char buffer[512];
char* filename = malloc(50 * sizeof(int));
if (!filename)
{
return 3;
}
bool jpeg_found = false;
int f = 0;
int n = 0;
while (!(feof(file)))
{
sprintf(filename, "%03i.jpg", f);
FILE *img = fopen(filename, "w");
if (!filename) return 6;
if (f > 0) fwrite(buffer, 1, 512, img);
n = 0;
while (n == 0)
{
if (feof(file))
{
fclose(img);
break;
}
fread(buffer, 1, 512, file); //read 512 bytes into a buffer
if (buffer[0] == 0xff && // start of a new JPEG?
buffer[1] == 0xd8 &&
buffer[2] == 0xff && (
buffer[3] & 0xf0) == 0xe0)
{
if (jpeg_found) // have you already found a JPEG or not?
{
// YES: close the previous file and open a new one,
fclose(img);
f += 1;
n = 1;
}
else // NO: start very 1st JPEG
{
fwrite(buffer, 1, 512, img);
jpeg_found = true;
}
}
else
{
if (jpeg_found) // Have your already found a JPEG or not?
{
// YES: Those 512 bytes belong to the current opened JPEG file
fwrite(buffer, 1, 512, img);
}
else // NO: Discard the 512 bytes and go to the start of the loop
{
continue;
}
}
}
}
free(filename);
fclose(file);