2012-10-18 26 views
3

您好我想找到一個原始文件試圖找到一個JPEG文件從存儲卡使用C

有人告訴我,一開始的每個JPEG圖像與任何
開始內部的JPEG格式拍攝的RAW文件 - 0xFF的0xd8 0xFF的0xe0的
- 0xFF的0xd8 0xFF的0xe1

所以我這樣做:

// open input file 
FILE* inptr = fopen("card.raw", "r"); 

// create an array to hold info read from the memory card 
char buffer[512]; 


int counter=0; 
int counter2=0; 


while ((fread(buffer, sizeof(char), 512, inptr)!=0)) 
{ 

    if(buffer[0]==0xff) 
    { 
     counter++; 
     printf("%2d - Found a jpeg!\n", counter); 

    } 

    else 
    { 
     //Just to test 
     counter2++; 
     printf("%2d - Nothing Found!\n", counter2); 
    } 
} 

但是,即使我當然肯定有一些圖片在那裏,程序沒有找到anythi NG。預先感謝您的建議。

+0

您可以在該SD卡上擁有一個壓縮文件系統(或存檔)。您的代碼似乎搜索以0xff開頭的扇區,但我會想象圖像可以以任意(512的非倍數)偏移量開始。 –

+0

您應該改用photorec。 – OmnipotentEntity

+0

RAW文件(根據圖像捕捉設備的製造商而有很大差異,並且通常不是很好記錄)通常是專有格式的圖像文件,而不僅僅是其他圖像格式的容器。因此,給定合適的軟件,它們可能*轉換成JPEG文件,但它們不一定包含* JPEG文件。 – twalberg

回答

3

找到了答案!,我需要聲明緩衝區爲unsigned char這樣的:

unsigned char buffer[512]; 
0

是,無符號的字符是這種情況下更自然,但如果你想使用符號的字符,以保持(簡單的「字符」可能會或可能不會因環境的簽署,更是明確的),然後,而不是使用0xFF時,你有可能會與-1比較:

if(buffer[0]==-1) 

這麼說,我會的,大概,有mmap - 整個文件一次,然後循環通過分配給我MORY。

最後,由於您正在尋找的不僅僅是0xff,而且是指示指示JPEG開始的整個序列,請使用memmem()搜索mmap-ed區域中的整個序列。這樣做也會處理JPG文件不在512塊開頭的可能性。

相關問題