我目前在cs50中的“Recover”pset上,我已经尝试了我的解决方案的多种变体。任务是恢复从存储卡中删除的50个JPEG文件。我们被指示检查每个512字节的fread传递的前4个字节,以指示JPEG文件的开始并将其写入新文件。一旦它达到另一个4字节匹配,我们应该关闭前一个文件并写入一个新的文件,直到达到1000(来自存储卡的数据在一个名为card.raw的文件中提供给我们)。
下面是我目前的解决方案。我的困惑是,我能够在运行我的程序时产生正好50个JPEGS,如上所述。然而,当我去打开任何新文件时,我遇到了VS代码中的错误,我将在我的代码下面包括。任何帮助都将在这里表示感谢- `
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t BYTE;
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Usage: ./recover IMAGE\n");
return 1;
}
FILE *forensic = fopen(argv[1], "r");
if (forensic == NULL)
{
printf("File was not found\n");
return 1;
}
FILE *currentFile;
currentFile = NULL;
int jpegCount = 1;
char *filename = NULL;
filename = malloc(8 * sizeof(char));
BYTE buffer[512];
while (fread(buffer, sizeof(char), 512, forensic) != 0)
{
// Check for matching 4 bytes, indicating start of a new JPEG
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
{
// If file exists, close it and start a new one
if (currentFile != NULL)
{
fclose(currentFile);
sprintf(filename, "%03i.jpg", jpegCount);
currentFile = fopen(filename, "w");
jpegCount++;
}
// If no file exists yet, create one
else
{
sprintf(filename, "%03i.jpg", jpegCount);
currentFile = fopen(filename, "w");
jpegCount++;
}
}
// If file exists, write to it
if (currentFile != NULL)
{
BYTE wBuffer[512];
fwrite(wBuffer, sizeof(BYTE), 512, currentFile);
}
}
fclose(currentFile);
fclose(forensic);
free(filename);
return 0;
}
字符串
再次,我的程序成功地产生了50个新的JPEG,但当我试图在VS Code中打开它们时,我得到了以下错误:
加载Web视图时出错:错误代码:无法注册服务工作者:NotSupportedError:无法为范围注册ServiceWorker('https://0foennjt10in3q0224oduooshmepdo2jsp1eg131ejbmkj7a2i7k.vscode-cdn.net/stable/8fa188b2b301d36553cbc9ce1b0a146ccb93351f/out/vs/workbench/contrib/webview/browser/pre/')with script('https://0foennjt10in3q0224oduooshmepdo2jsp1eg131ejbmkj7a2i7k.vscode-cdn.net/stable/8fa188b2b301d36553cbc9ce1b0a146ccb93351f/out/vs/workbench/contrib/webview/browser/pre/service-worker.js?v=4&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&remoteAuthority=codespaces+sebdoubleu-code50-111027905-wpxr5g54pv9h9667'):用户拒绝了使用Service Worker的权限。
我真的很感激这里的任何帮助。我是一个初学者,很可能我犯了一个我没有看到的小错误。也有可能我完全错了,需要重新开始。我只是不知道从哪里开始,因为我觉得我已经尝试了我能想到的一切。
1条答案
按热度按时间iqxoj9l91#
提供的代码存在几个问题:
声明了
wBuffer
,但在写入之前没有初始化或填充任何数据。由于您已经用要写入的内容填充了缓冲区,因此不需要此缓冲区。jpegCount变量的增量应从0
开始,不是1
。这将确保第一个文件名为000.jpg
。当创建或打开新的JPEG文件时,您不会检查fopen
函数的结果。确保您不会处理NULL
指针。下面是更正后的代码:字符串
我已经加入了错误检查,并通过删除冗余来简化代码。