所以我的recover.c程序运行良好,除了它无法从card.raw文件中恢复所有50张图像。
我只能让它恢复50张图片中的49张。我非常确定丢失的图像是第一张图像(一个雪白背景的女孩),因为我在编写和测试的过程中很早就看到了这张图片,但最终的程序似乎不再恢复那个图像了。
任何帮助人员?
/**
* recover.c
*
* Computer Science 50
* Problem Set 4
*
* Recovers JPEGs from a forensic image.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t BYTE;
typedef uint32_t DWORD;
typedef int32_t LONG;
typedef uint16_t WORD;
typedef struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;
int main(void)
{
// OPEN CARD FILE
char* infile = "card.raw";
FILE* card = fopen(infile, "r");
if (card == NULL)
{
printf("Could not open %s.\n", "card.raw");
return 2;
}
int f = 0, c = 0, imageno = 0;
// c signals that a jpg is being written
FILE* images;
char title[25];
BYTE buffer[512];
/*repeat until end of card*/
do
{
//read one block into buffer
fread(buffer, 512, 1, card);
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff)
{
if (imageno < 10)
{
sprintf(title, "00%d.jpg", imageno); //change jpg title
}
else
{
sprintf(title, "0%d.jpg", imageno); //change jpg title
}
if (f == 1) //close previous jpg
{
fclose(images);
imageno++;
}
images = fopen(title, "w");
f = 1; //very first jpg has been opened
c = 1; //jpg open
}
//jpg already open?
if (c == 1) fwrite(buffer, 512, 1, images);
}
while (!feof(card));
return 0;
//close any remaining files
}
答案 0 :(得分:1)
您可以根据变量imageno
的值创建文件名。您稍后会增加该变量,但仅限于您的程序之前打开另一个文件的情况。特别是,在打开第一个文件后不会增加它,因此为第一个文件计算的第二个文件的名称相同,并且第一个提取的文件将被覆盖。
每次创建新文件名时,或每次打开文件时,都应无条件地增加imageno
。