2012-01-19 27 views
4

我正嘗試用C#讀入一個用CArchive寫入的文件。從我可以告訴格式爲:C++ MFC對象CArchive寫入的文件格式是什麼?

[數據] [下一組數據的長度] ...等

我仍然對一些數據的模糊,雖然。我如何閱讀日期數據?怎麼樣漂浮,整數,雙打等?

此外,[下一組數據的長度]可以是字節或字或雙字。我怎麼知道它們是什麼時候?例如,對於一個字符串「1.10」的數據是:

04 31 2e 31 30 

04是長度,很明顯,其餘的爲1.10十六進制值。不重要的。後來我有一個長度爲41個字符的字符串,但[長度]值爲:

00 00 00 29 

爲什麼4個字節的長度? (0x29 = 41)

主要問題是:有沒有CArchive輸出格式的規格?

+3

我不知道它是否在任何地方被正式指定 - 假設您還會使用CArchive讀取它。代碼本身就是文檔。 –

+0

[http://samples.software.microsoft.com/library/default.aspx](http://stackoverflow.com/q/55369/1154743) – yarek

回答

6

要回答有關字符串的問題,存檔文件中存儲的長度值本身是可變長度,具體取決於字符串的長度和編碼。如果字符串是< 255個字符,則使用一個字節作爲長度。如果字符串爲255 - 65534個字符,則使用3個字節 - 一個1字節的0xFF標記,後跟2個字節的字。如果字符串爲65535+個字符,則使用7個字節 - 一個3字節的標記,後跟一個4字節的雙字。爲了使它更加複雜,如果字符串是Unicode編碼的,則長度值前面有一個3字節的0xFF 0xFFFE標記。因此,在任何組合中,您都不會看到自己的4字節長度,因此您展示的內容必須是屬於其他內容的3 0x00字節,後跟1個字節的字符串長度0x29

所以,要讀一個字符串的正確方法如下:

假設:字符串數據爲ANSI,除非另行告知。

  1. 讀取一個字節。如果它的值是< 255,則字符串長度是值,轉到3.

  2. 讀一個單詞。如果它的值是0xFFFE,則字符串數據是Unicode,轉到1.否則,如果它的值是< 65535,則字符串長度是它的值,轉到3.否則,讀取一個dword,字符串長度是它的值,轉到3。

  3. 根據字符串是Ansi還是Unicode,讀取8位或16位值的字符串長度數,然後根據需要轉換爲所需的編碼。

+0

「1.讀取一個字節,如果它的值<255,則字符串長度是值,轉到3.」 如何讀取其值超過255的字節? –

+0

請仔細閱讀我寫的內容。步驟#1中的比較不包括255本身。一個255的字符串長度將進入第2步,而是從一個「0xFF」標記開始,然後是一個2字節的「WORD」值爲255的數字。 –

+0

我明白了!謝謝 –