我目前正在使用 cs50 中的“恢复”pset,并且我已经尝试了解决方案的多种变体。任务是恢复从存储卡中删除的 50 个 JPEG 文件。我们被指示检查 fread 的每个 512 字节通道的前 4 个字节,以指示 JPEG 文件的开始并将其写入新文件。一旦达到另外 4 个匹配的字节,我们就应该关闭前一个文件并写入一个新文件,直到达到 EOF(存储卡中的数据在名为 card.raw 的文件中提供给我们)。
以下是我当前的解决方案。我的困惑是,如上所述,我在运行程序时能够生成 50 个 JPEG。但是,当我打开任何新文件时,我在 VS Code 中遇到了错误,我将其包含在我的代码下面。任何帮助将不胜感激 - `
#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 中打开它们时,出现以下错误:
加载webview时出错:错误:无法注册服务工作者:NotSupportedError:无法注册范围的ServiceWorker('https://0foennjt10in3q0224oduooshmepdo2jsp1eg131ejbmkj7a2i7k.vscode-cdn.net/stable/8fa188b2b301d36553cbc9ce1b0a146 ccb93351f/out/vs/workbench/contrib/webview/ browser/pre/') 与脚本 ('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 的权限..
我非常感谢这里的任何帮助。我是初学者,很可能我犯了一个我没有看到的小错误。也有可能我的做法完全错误,需要重新开始。我只是不知道接下来该去哪里,因为我觉得我已经尝试了目前能想到的一切。
提供的代码有几个问题:
wBuffer
已声明,但在写入之前未初始化或填充任何数据。不需要此缓冲区,因为缓冲区已经填充了要写入的内容。
jpegCount 变量的增量应从 0
开始,而不是从 1
开始。这将确保第一个文件被命名为000.jpg
。
创建或打开新的 JPEG 文件时,您不会检查 fopen
函数的结果。确保您处理的不是 NULL
指针总是好的。
这是更正后的代码:
#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 = NULL;
int jpegCount = 0; // Start counting from 0
char *filename = malloc(8 * sizeof(char));
if (filename == NULL)
{
fclose(forensic);
printf("Memory allocation error\n");
return 1;
}
BYTE buffer[512];
while (fread(buffer, sizeof(BYTE), 512, forensic) == 512) // Using sizeof(BYTE) for clarity
{
// 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 before starting a new one
if (currentFile != NULL)
{
fclose(currentFile);
}
sprintf(filename, "%03i.jpg", jpegCount);
currentFile = fopen(filename, "w");
if (currentFile == NULL)
{
free(filename);
fclose(forensic);
printf("Error creating file\n");
return 1;
}
jpegCount++;
}
// If file exists, write to it
if (currentFile != NULL)
{
fwrite(buffer, sizeof(BYTE), 512, currentFile); // Write using the original buffer
}
}
// Close any open files
if (currentFile != NULL)
{
fclose(currentFile);
}
fclose(forensic);
free(filename);
return 0;
}
我合并了错误检查并通过删除冗余来简化代码。