нужна помощь с анализом двоичного файла - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь взаимодействовать с программой с открытым исходным кодом, написав приложение на C ++, которое может читать, изменять и записывать двоичный формат файла, используемый этой программой. Хорошая вещь заключается в том, что программа имеет открытый исходный код, а плохая в том, что ее бинарные файлы не следуют никаким «стандартным» правилам, а представляют собой собственный способ чтения и сохранения.

Вот как программа сохраняет переменную bool в файле:

memset(keyword, 0, 100);
sprintf(keyword, "drawbox");
fout.write((char*)keyword, strlen(keyword)+1);
fout.write((char*)&m_drawBox, sizeof(bool));

и вот как он читает bool:

else if (strcmp(keyword, "drawbox") == 0)
fin.read((char*)&m_drawBox, sizeof(bool));

Эта часть отлично работает, я могу разобрать. Я могу анализировать отдельные переменные, например, целые числа.

Моя проблема с частью, когда она сохраняет векторы или кватернионы.

Вектор сохранения position:

memset(keyword, 0, 100);
sprintf(keyword, "position");
fout.write((char*)keyword, strlen(keyword)+1);
fout.write((char*)&m_position, 3*sizeof(float));

Чтение вектора position:

fin.read((char*)&m_volMax, 3*sizeof(float));
else if (strcmp(keyword, "position") == 0)

Итак, все это были фрагменты исходного кода. В моем коде, если я пытаюсь использовать следующее, у меня есть проблемы.

Вот части из моего кода:

struct Vec
{
    float x,y,z;
};

Vec m_position;

else if (strcmp(keyword, "position") == 0)
    fin.read((char*) &kf.m_position, 3*sizeof(float));

Но это не работает. Вот значения, которые я получаю из файла примера:

m_position x = -1.07374e+008
m_position y = -1.07374e+008
m_position z = -1.07374e+008

Так что значения почему-то не разбиваются на x, y, z, а повторяются на одни и те же части x, y, z!

Может кто-нибудь помочь мне, что вызывает это? На самом деле, что это за способ сохранения файлов? Разве это не очень странная идея записать память прямо в файл, используя (* char)?

Вот двоичные данные, соответствующие 3 * вектору с плавающей точкой m_position, в исходном файле.

45 01 67 44 9E 57 19 C3 48 14 09 45

Ответы [ 2 ]

6 голосов
/ 18 июня 2011

m_position x = -1.07374e + 008

Если вы посмотрите на необработанное представление памяти отладчика на значение, то увидите, что значения байтов с плавающей запятой равны 0xcccccccc. Это особое значение, компилятор MSVC использует его для инициализации переменных в сборке Debug.

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

В отсутствие дополнительной информации есть по крайней мере одно простое объяснение: вызов fin.read () ничего не прочитал. Я должен предположить, что ваш код не содержит никакой проверки ошибок, это обычное упущение.

0 голосов
/ 19 июня 2011

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

  • Ганс Пассант сказал, что fin.read () ничего не читает. Итак ....

Я не говорю, что это ваш случай, но проверка не повредит, не так ли?

...