在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字符串。
这是一切都很好,我猜,但我怎么得到二进制或十六进制数据的表示,而不打印它,因为我需要在数据写入文件之前做比较?我实际上并不需要在此程序的最终版本中打印任何内容。 – joedillian 2010-11-15 00:20:17
@joedillian您已经拥有二进制数据,您可以将它读入'buf'中,但是如果您想从原始SD卡图像中提取这些数据,将会花费相当多的时间。该映像可能包含您必须解释的文件系统。 – nos 2010-11-15 01:22:05