在C中读取32位二进制

时间:2011-06-29 12:42:58

标签: c input binary

C / C ++很新,我在这里苦苦挣扎。我有一个带有32位有符号整数的.bin文件,我想读入。我首先需要读入前两个数字,因为它们包含有关其余数据的信息,但我甚至无法理解这一点。

是一个测试文件
00000004
00000003

因为运行我的代码的前两个数字为我的数据大小变量提供了808464394。我已经尝试将printf格式指定为%lx,以防万一我搞砸了printf格式。

我已经选择了一个long int来读取我的数据,因为我理解一个长期的32位签名,这样才是最好的选择。然而,稍后我将需要切断每个long并查看long中的位组。

有人可以告诉我为什么打印出的数字不是我想要的数字。此外,如果long int不是合适的数据类型,请您建议替代方案。

下面的代码。

谢谢

int getsizes(long &data_size, long &image_size);

int main()
{

  long* data = NULL; // pointer of arry we will read data into.
  long data_size, image_size;

  // get data_size and image_size from task1.bin

   if (getsizes(data_size,image_size)) cerr << "Error getting data_size,image_size" ;


  int Idata_size = (int) data_size; // creat my array to store rest of file in
  data = new long[Idata_size];

  // get rest of data (still to do)

  // interprate data operations (still todo).


  delete [] data;  // freeing memory just for completeness even though program is about to exit.
  data = NULL;

  return 0;
}


\\functions


int getsizes(long &data_size, long &image_size)
{

  FILE *fp;


  fp=fopen("test01.bin", "rb"); // open for reading
  if (fp==0) cerr << "Error openeing file"<<endl;

  fread(&data_size, sizeof(data_size), 1, fp); //sizeof(data_size) should be 32

  fread(&image_size, 32, 1, fp);

  #ifdef DEBUG
    printf ("data_size= %ld \n", data_size);
    cout <<"call4" <<endl;
    printf ("image_size= %ld \n", image_size);
  #endif

  fclose(fp); // 

  return 0; // succsess.

}

2 个答案:

答案 0 :(得分:4)

您正在将数字的十进制表示直接读入内存中的数字。数字808464394是0x30303030,它是一个由四个零(输入文件的前四个字节)组成的序列,当被解释为ASCII时。

使用fscanf代替fread

答案 1 :(得分:1)

另一个问题是您的测试输入不是二进制文件,而是文本文件。

二进制文件通常由另一个程序编写,当你在记事本中打开它时,它会显示一堆不可读的符号。如果您在打开文件时可以阅读整个文件