为什么我会遇到段错误(二进制数据解析)c
Why am I getting a segfault (binary data parsing) c
我一次扫描 512 个字节的原始位。如果前 4 个字节与 jpeg 文件后缀匹配,我将创建一个新的 jpeg 并将该块和所有后续块写入其中,直到遇到新的 jpeg 后缀。
出于某种原因,它在第一次写入调用之后的读取调用中出现段错误。
/**
* recover.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];
我一次扫描 512 个字节的原始位。如果前 4 个字节与 jpeg 文件后缀匹配,我将创建一个新的 jpeg 并将该块和所有后续块写入其中,直到遇到新的 jpeg 后缀。
出于某种原因,它在第一次写入调用之后的读取调用中出现段错误。
/** * recover.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];