Чтение в 32-битном двоичном в C - PullRequest
2 голосов
/ 29 июня 2011

Очень плохо знаком с C / C ++, и я борюсь здесь. У меня есть файл .bin с 32-разрядными знаковыми целыми числами в шестнадцатеричном формате, в который я хочу прочесть. Сначала мне нужно прочитать первые два числа, так как они содержат информацию об остальной части данных, но я даже не могу получить это правильно. Тестовый файл имеет

00000004
00000003

, так как первые два числа, выполняющие мой код, дают мне 808464394 для моей переменной размера данных. Я попытался указать формат printf как% lx, просто на тот случай, если я испорчу форматирование printf.

Я выбрал long int для чтения моих данных, так как я понимаю, что long in имеет 32-битную подпись, так что это будет лучшим выбором. Позже мне, однако, нужно будет разбивать каждое длинное и смотреть на группы битов в длинном.

Может, кто-нибудь посоветует мне, почему распечатанные цифры не те, которые я хочу. Также, если 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 ]

4 голосов
/ 29 июня 2011

Вы читаете десятичные представления чисел прямо в числа в памяти. Число 808464394 - это 0x30303030, представляющее собой последовательность из четырех нулей (первые четыре байта входного файла), если интерпретируется как ASCII.

Используйте fscanf вместо fread.

1 голос
/ 29 июня 2011

Другая проблема заключается в том, что ваш тестовый ввод не является двоичным файлом, это текстовый файл.

Бинарный файл обычно пишется другой программой, и когда вы открываете его в блокноте, он показывает кучу нечитаемых символов. Если вы можете прочитать весь файл при его открытии

...