我恢复的IMG在恢复CS50中与原始版本不匹配
问题描述:
问题是从.raw文件中恢复一些JPG文件。我恢复的IMG在恢复CS50中与原始版本不匹配
当我运行check50我得到“恢复IMG不匹配”。
:)
recover.c存在。 :)
recover.c编译。 :)
处理缺乏法医图像的:(
复苏000.jpg正确– 恢复的形象不符:(
恢复图像居中正确– 恢复的形象不符:(
复苏015.jpg正确– 015.jpg找不到
我真的很努力地找出问题所在,每次我找不到问题出在哪里,我希望有人可以和gi给我一个和平的建议。
#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;
}
答
中,你做事的顺序是非常混乱,并导致错误。例如:
-
filename
第一次使用时未初始化。 - 使用它创建文件名后,您增加了计数器
foundjpg
,该文件名在您的程序中意味着第二张图像被称为01.jpg
。所有图像索引都被关闭了,最后一个图像索引被丢失。 - 当id字节没有标识有效的jpg时,没有新的记录被读取,并且循环永不结束。
你应该重新组织你的代码,以便它以一种自然的方式一个接一个地执行。该计划可能是这样的:
- 检查命令行参数
- 打开RAW文件
- 主回路:
- 读固定大小的块。如果它不能被读取,退出循环
- 检查第一字节识别JPG如果是这样:
- 写
- 写街区,靠近JPG文件创建文件名
- 打开JPG文件
- 递增块计数器
- 关闭原始文件
您必须决定如何处理错误。你只是跳过错误的块或者你中止程序?
目前还不清楚所有图像是否是512字节长,这似乎不大可能。也许您必须从标题中读取实际的图像大小,然后复制整个图像。
在[cs50.se]的堆栈交换网络上有一个指定的站点。 – StoryTeller