在C系统中读取二进制文件(在UNIX系统上)(Ubuntu 10.10)

问题描述:

这是我第一次在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对应于我正在查找的十六进制值的二进制值,但它们与我目前的其余代码并不真正相关。

而不是printf(buf);你需要遍历每个字节并做printf("%02x ", byte)。看看hexdump都源在这里:)

你应该在什么的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