Tommy
Tommy

Reputation: 611

Reading in 32 bit binary in C

Very new to C / C++ and I am struggling here. I have a .bin file with 32-bit signed integers in hex I wish to read in. I first need to read in the first two numbers as these contain information about hte rest of the data but I can't even get this correct. A test file has

00000004
00000003

as the first two numbers running my code gives me 808464394 for my data size variable. I've tried specifying the printf format as %lx as well just in-case I'm screwing up on the printf formatting.

I've chosen a long int to read my data into as I understand a long in is 32 bit signed so that that would be the best choose. Later on I will however need to chop up each long and look at groups of bits within the long.

Could someone please advice me as to why the numbers being printed out are not the ones I want. Also if long int is not a suitable data type could you please suggest an alternative.

Code attached below.

Thank you

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.

}

Upvotes: 2

Views: 3469

Answers (2)

Marcelo Cantos
Marcelo Cantos

Reputation: 185862

You are reading the decimal representations of the numbers directly into numbers in memory. The number 808464394 is 0x30303030, which is a sequence of four zeros (the first four bytes of your input file), when interpreted as ASCII.

Use fscanf instead of fread.

Upvotes: 4

Andrew
Andrew

Reputation: 11

Another issue is that your test input is not a binary file, it is a text file.

A binary file is generally written by another program, and when you open it in notepad it will show a bunch of unreadable symbols. If you can read the whole file when you open it

Upvotes: 1

Related Questions