gpt4 book ai didi

c - 我恢复的 IMG 与恢复 CS50 中的原始 IMG 不匹配

转载 作者:行者123 更新时间:2023-11-30 14:54:58 25 4
gpt4 key购买 nike

问题是从 .raw 文件中恢复一些 JPG。

当我运行 check50 时,我得到“恢复的 img 不匹配”。

:)recover.c 存在。
:) 编译recover.c。
:) 处理缺乏取证图像的问题
:( 正确恢复 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;

}

最佳答案

您执行操作的顺序非常困惑并且会导致错误。例如:

  • 第一次使用时,文件名未初始化。
  • 在使用计数器 foundjpg 创建文件名后,您可以增加计数器 foundjpg,这在程序中意味着第二个图像名为 01.jpg。所有图像索引都相差 1,最后一个丢失。
  • 当 id 字节无法识别有效的 jpg 时,不会读取新记录,并且循环永远不会结束。

您应该重新组织您的代码,以便它以自然的方式完成一件又一​​件的事情。该程序可能如下所示:

  • 检查命令行参数
  • 打开原始文件
  • 主循环:
    • 读取固定大小的 block 。如果无法读取,则退出循环
    • 检查第一个字节是否标识 jpg,如果是:
      • 创建文件名
      • 打开jpg文件进行写入
      • 写入 block 并关闭jpg文件
      • 增加 block 计数器
  • 关闭原始文件

您必须决定如何处理错误。您只是跳过错误的 block 还是中止程序?

也不清楚是否所有图像都是 512 字节长,这似乎不太可能。也许您必须从​​标题中读取实际图像大小,然后复制整个图像。

关于c - 我恢复的 IMG 与恢复 CS50 中的原始 IMG 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46390721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com