2011-06-18 91 views
0

我想通過編寫一個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 
+0

對於初學者來說,如果嘗試移植它,會產生字節序問題。 –

+0

什麼是kf?你確定你正在閱讀你正在檢查的同一個矢量嗎? –

+0

爲什麼你的fin.read在else之內,但是示例代碼在else之前呢?似乎是一個錯字或一些觸發邏輯? – devyndraen

回答

6

m_position X = -1.07374e + 008

如果與價值的調試器的原始內存觀點看,你會看到漂浮的字節值是0xcccccccc。這是一個特殊的值,MSVC編譯器使用它來初始化Debug版本中的變量。

換句話說,你的m_position變量永遠不會被分配。

缺少更多信息,至少有一個簡單的解釋:fin.read()調用沒有讀取任何內容。我必須假設你的代碼不包含任何錯誤檢查,這是一個常見的錯誤。

+0

謝謝,沒有這個答案,需要我多年才能發現那些實際上意味着該變量是未初始化的。考慮到這一點,不難發現我的循環實際上並沒有完成。 – zsero

0

Actualy我在幾周前做了二進制文件解析,並得到一個與您的結果相同的醜陋bug。問題是,當我將二進制數據寫入文件時,我忘記關閉文件。所以閱讀數據並解析回ascii我得到了與你一樣的結果。

  • Hans Passant說fin.read()沒有讀取任何內容。所以......

我不是說這是你的情況,但檢查不會傷害,是嗎?

+0

這只是一個循環沒有完成,但沒有漢斯的回答,我不知道這些值是未初始化的。 – zsero

+0

啊我明白了。很高興你發現錯誤。良好的編碼。 – legion