我試圖掃描一個文件,尋找1MB的JPEG文件,這些文件將被連續存儲。我的方法是創建一個結構來匹配前4個字節和JPEG簽名,如果是true,則將整個512緩衝區寫入指定文件,直到找到另一個jpeg簽名,然後創建一個新文件。下面的代碼創建2個文件,由於前幾個字節不是jpeg簽名的一部分,因此兩個文件都不可讀。任何想法,我出錯了?我嘗試了我的if語句的變體,我在那裏測試了簽名,但到目前爲止還沒有運氣。匹配JPEG簽名
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t BYTE;
typedef struct
{
BYTE first;
BYTE second;
BYTE third;
BYTE fourth;
}
JPGTEST;
int main(int argc, char* argv[])
{
FILE* inptr = fopen("card.raw", "r");
if (inptr == NULL)
{
printf("Could not open file\n");
return 2;
}
FILE* outptr;
//initialize jpeg count and variable for filename
int count = 0;
char name[8];
//allocate memory
char buffer[512];
JPGTEST myjpg;
int is_open = 0;
while (fread(&buffer, 512, 1, inptr) != 0)
{
//test first 4 bytes to see if jpeg
fread(&myjpg, sizeof(JPGTEST), 1, inptr);
//if match, name and write to file
if (myjpg.first == 0xff && myjpg.second == 0xd8 && myjpg.third == 0xff && (myjpg.fourth == 0xe0 || myjpg.fourth == 0xe1))
{
sprintf(name, "%03d.jpg", count);
if (is_open == 0)
{
outptr = fopen(name, "w");
fwrite(buffer, sizeof(buffer),1,outptr);
is_open = 1;
}
if (is_open == 1)
{
fclose(outptr);
outptr = fopen(name, "w");
fwrite(buffer, sizeof(buffer),1,outptr);
count++;
}
}
else
{
if (is_open == 1)
{
fwrite(buffer, sizeof(buffer),1,outptr);
}
}
}
fclose(inptr);
fclose(outptr);
return 0;
}
從看一眼,似乎myBuffer包含字節0-511,myjpeg包含字節512-515。提示:不要做第二次閱讀。檢查緩衝區的前4個字節。 (或者寫myjpeg,接着是X字節數X = ??) – enhzflep