gpt4 book ai didi

c - 为什么我会遇到段错误(二进制数据解析)c

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:52 25 4
gpt4 key购买 nike

我一次扫描 512 个字节的原始位。如果前 4 个字节与 jpeg 文件后缀匹配,我将创建一个新的 jpeg 并将该 block 和所有后续 block 写入其中,直到遇到新的 jpeg 后缀。

出于某种原因,它在第一次写入调用之后的读取调用中出现段错误。

/** * 恢复.c * * 计算机科学 50 * 问题集 4 * * 从取证图像中恢复 JPEG。 */

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

typedef uint8_t BYTE;

int main(int argc, char* argv[])
{
//load in file
FILE* file = fopen("card.raw", "r");
FILE* newfile = NULL;

//error opening file
if (file==NULL){
return 1;
}

//create buffer and outfile index
BYTE buffer[512]; //
int filecount = 0;
char newfilename[3];

//iterate through file, break on eof
while (1){//(!feof(file)){//(fgetc(file) != EOF){

//seek back to 512 block start
//fseek(file,-1,SEEK_CUR);
//fread(&buffer,1,512,file);
if (fread(buffer,512,1,file) <= 0){
break;
}

//Check if first 4 bytes are jpeg signature
if ((buffer[0] == 0xff &&
buffer[1] == 0xd8 &&
buffer[2] == 0xff &&
buffer[3] == 0xe0)||
(buffer[0] == 0xff &&
buffer[1] == 0xd8 &&
buffer[2] == 0xff &&
buffer[3] == 0xe1 )){

//close out previously created jpeg
if (newfile != NULL){
//file close error
if (fclose(newfile) == EOF){
return 2;
}
newfile = NULL;
}

//create new jpeg
sprintf(newfilename,"%03d.jpeg",filecount++);
newfile = fopen(newfilename,"w");

}

//Write blocks to newfile
if (newfile != NULL){
if (fwrite(buffer,512,1,newfile) <= 0){
return 4;
}

}
}

//close out last newfile
if (newfile != NULL){
//file close error
if (fclose(newfile) == EOF){
return 3;
}
newfile = NULL;
}

//close infile
fclose(file);



//we should find 16 images


}

最佳答案

文件名数组不足

char newfilename[3];

当你这样做的时候

sprintf(newfilename,"%03d.jpeg",filecount++);

需要

char newfilename[9];

关于c - 为什么我会遇到段错误(二进制数据解析)c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29723962/

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