2012-01-19 25 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

我明白了!谢谢 –