2010-11-14 94 views
0

這是我第一次在C和UNIX系統上編程。我正在嘗試做相當簡單的事情。我有一個二進制文件,它是一張Compact Flash相機卡的圖像,由幾張JPG圖像組成。我試圖讀取文件,找到對應於FF D8 FF E0或FF D8 FF E1的字節序列,這是JPG文件開頭的符號,然後寫入該符號和下一個新jpg文件之間的所有內容。在C系統中讀取二進制文件(在UNIX系統上)(Ubuntu 10.10)

目前我只是試圖讓我的電腦按原樣打印出文件,通過讀取512個大小的塊,在原始文件系統中指定大小的塊。我有以下代碼:

#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    FILE * raw; 
    FILE * currentimage; 
    char buf[512]; 
    char beg1[32] = "11111111110110001111111111100001"; 
    char beg2[32] = "11111111110110001111111111100000"; 

    raw = fopen("card.raw", "rb"); 

    while((fread(buf, sizeof(raw), 512, raw) > 0)) 
    { 
     printf(buf); 
     printf("\n"); 

    } 
} 

它只是打印出格式化成什麼樣我假定該文件是ASCII,所以它看起來像一堆官樣文章的。我怎樣才能將這些數據格式化爲二進制1和0或更好的十六進制0-F?

任何幫助將不勝感激。

P.S. beg1和beg2對應於我正在查找的十六進制值的二進制值,但它們與我目前的其餘代碼並不真正相關。

回答

2

你應該在什麼的printf讀了(確實,如沒有什麼編程語言,我知道,你應該EVER使用數據作爲printf的第一個參數。第一個參數應該是一個模板,你使用它的方式應該是「%s」。要查看十六進制輸出,這種取代你的循環:

int size; 
while((size = (fread(buf, sizeof(raw), 512, raw)) > 0)) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     printf("%2X", buf[i]); 
    } 
    printf("\n"); 

} 

要在打印之前回答您關於使用C對比問題: 數值數據是正確的,在BUF - BUF [i]是從-127的字符到128包含值。如果你想看看它的十六進制表示,可以這樣做:

sprintf(some_other_buffer, "%2X", buf[i]); 

然後你就可以在some_other_buffer執行字符串操作,知道這是一個2字符串。

+0

這是一切都很好,我猜,但我怎麼得到二進制或十六進制數據的表示,而不打印它,因爲我需要在數據寫入文件之前做比較?我實際上並不需要在此程序的最終版本中打印任何內容。 – joedillian 2010-11-15 00:20:17

+0

@joedillian您已經擁有二進制數據,您可以將它讀入'buf'中,但是如果您想從原始SD卡圖像中提取這些數據,將會花費相當多的時間。該映像可能包含您必須解釋的文件系統。 – nos 2010-11-15 01:22:05