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

在UNIX系统(Ubuntu 10.10)上用C语言读取二进制文件,c,file-io,binaryfiles,C,File Io,Binaryfiles,这是我第一次用C语言在UNIX系统上编程。我正在尝试做一些相当简单的事情。我有一个二进制文件,它是一个小型闪光灯卡的图像,由几个JPG图像组成。我试图通读该文件,找到对应于FF D8 FF E0或FF D8 FF E1的字节序列,即JPG文件开头的符号,然后写入该符号和新JPG文件旁边的符号之间的所有内容 目前,我正试图让我的计算机按原样打印文件,通过读取512大小的块,即原始文件系统中指定的块大小。我有以下代码: #include <fcntl.h> #include <un

这是我第一次用C语言在UNIX系统上编程。我正在尝试做一些相当简单的事情。我有一个二进制文件,它是一个小型闪光灯卡的图像,由几个JPG图像组成。我试图通读该文件,找到对应于FF D8 FF E0或FF D8 FF E1的字节序列,即JPG文件开头的符号,然后写入该符号和新JPG文件旁边的符号之间的所有内容

目前,我正试图让我的计算机按原样打印文件,通过读取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");

    }
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
文件*raw;
文件*当前图像;
char-buf[512];
char beg1[32]=“1111110110001111111111100001”;
char beg2[32]=“1111110110001111111111100000”;
原始=fopen(“card.raw”、“rb”);
而((fread(buf,sizeof(原始),512,原始)>0))
{
printf(buf);
printf(“\n”);
}
}
它只是打印出格式化为ASCII的文件,所以看起来像是一堆乱七八糟的书。如何将这些数据格式化为二进制1和0,或者更好的是,十六进制0-F

任何帮助都将不胜感激

p.S.beg1和beg2对应于我正在寻找的十六进制值的二进制值,但它们与我目前拥有的其余代码并不真正相关。

而不是
printf(buf)
您需要循环遍历每个字节并执行
printf(“%02x”,byte)
。在这里查看hextump的源代码:

    • 而不是
      printf(buf)
      您需要循环遍历每个字节并执行
      printf(“%02x”,byte)
      。在这里查看hextump的源代码:


      您应该仔细阅读printf()的功能,因为在我所知的任何编程语言中,如果您将数据用作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");
      
      }
      

      然后,您可以在其他缓冲区上执行字符串操作,知道它是一个2个字符的字符串。

      您应该阅读printf()的功能,就像我所知的任何编程语言一样,如果您曾经使用数据作为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");
      
      }
      

      然后,您可以在其他缓冲区上执行字符串操作,知道它是一个2个字符的字符串。

      我想这很好,但是如何在不打印数据的情况下获得二进制或十六进制数据的表示,因为在将数据写入文件之前,我需要对数据进行比较?我实际上不需要在这个程序的最终版本中打印任何东西。@joedillian你已经有了二进制数据,你可以将它读入
      buf
      但是,如果你真的想从原始sd卡图像中提取出来,这需要相当多的时间。该图像可能包含一个您必须解释的文件系统。我想这很好,但如何在不打印数据的情况下获得数据的二进制或十六进制表示,因为在将数据写入文件之前,我需要对数据进行比较?我实际上不需要在这个程序的最终版本中打印任何东西。@joedillian你已经有了二进制数据,你可以将它读入
      buf
      但是,如果你真的想从原始sd卡图像中提取出来,这需要相当多的时间。该图像可能包含您必须解释的文件系统。