我想通過編寫一個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 * float向量m_position的二進制數據。
45 01 67 44 9E 57 19 C3 48 14 09 45
對於初學者來說,如果嘗試移植它,會產生字節序問題。 –
什麼是kf?你確定你正在閱讀你正在檢查的同一個矢量嗎? –
爲什麼你的fin.read在else之內,但是示例代碼在else之前呢?似乎是一個錯字或一些觸發邏輯? – devyndraen