我试图解决cs50x的pset 4恢复问题。每当我们发现 jgp 文件的正确标头时,我们就应该创建一个新图像,我尝试这样做。但由于某种原因,代码仍然只写入部分图像。每当代码发现正确的标头时,它就会增加 img_count 的值,然后才打开一个新图像。
问题链接:https://cs50.harvard.edu/x/2024/psets/4/recover/
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
typedef uint8_t BYTE;
int main(int argc, char *argv[])
{
int j = 0;
if (argc != 2)
{
printf("Usage: ./recover forensic_image_file\n");
return 1;
}
FILE *for_image = fopen(argv[1], "r");
if (for_image == NULL)
{
printf("Could not open %s.\n", argv[1]);
return 1;
}
char img_recovered[8];
img_recovered[3] = '.';
img_recovered[4] = 'j';
img_recovered[5] = 'p';
img_recovered[6] = 'g';
int img_count = -1;
BYTE buffer[512];
while (fread(buffer, 1, 512, for_image))
{
if ((buffer[0] = 255) && (buffer[1] == 216) && (buffer[2] == 255) && (buffer[3] / 16 == 14))
{
j++;
img_count++;
img_recovered[0] = (img_count / 100) + '0';
img_recovered[1] = ((img_count % 100) / 10) + '0';
img_recovered[2] = (img_count % 10) + '0';
FILE *for_recovery = fopen(img_recovered, "w");
fwrite(buffer, 1, 512, for_recovery);
fclose(for_recovery);
}
else if (j > 0)
{
img_recovered[0] = (img_count / 100) + '0';
img_recovered[1] = ((img_count % 100) / 10) + '0';
img_recovered[2] = (img_count % 10) + '0';
FILE *for_recovery = fopen(img_recovered, "a");
fwrite(buffer, 1, 512, for_recovery);
fclose(for_recovery);
}
}
fclose(for_image);
}
你有一个错误。
在循环内的
if
语句中,您使用赋值运算符 (=
) 代替比较运算符 (==
)
改变:
(buffer[0] = 255)
进入:
(buffer[0] == 255)
由于该错误,代码将每 512 个字节更改为
0xFF