Я пытаюсь взаимодействовать с программой с открытым исходным кодом, написав приложение на 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