C++ MFC对象CArchive写入的文件格式是什么?

Mik*_*ebb 5 c++ format carchive

我试图用C#读入一个用CArchive编写的文件.据我所知,格式是:

[下一组数据的长度] [数据] ......等

不过,我对某些数据仍然很模糊.如何阅读日期数据?浮标,整数,双打等怎么样?

此外,[下一组数据的长度]可以是字节或字或双字.我怎么知道它们各自的时间?例如,对于字符串"1.10",数据是:

04 31 2e 31 30
Run Code Online (Sandbox Code Playgroud)

04是长度,显然和其余为1.10十六进制值.不重要的.后来我有一个41个字符长的字符串,但[length]值是:

00 00 00 29
Run Code Online (Sandbox Code Playgroud)

为什么长度为4个字节?(0x29 = 41)

主要问题是:CArchive输出的格式是否有规范?

Rem*_*eau 8

要回答有关字符串的问题,存档中存储的长度值本身是可变长度,具体取决于字符串的长度和编码.如果字符串是< 255字符,则使用一个字节作为长度.如果字符串是255 - 65534字符,则使用3个字节 - 1个字节的0xFF标记,后跟2个字节的字.如果字符串是65535+字符,则使用7个字节 - 3字节0xFF 0xFF 0xFF标记,后跟4字节双字.为了使其更复杂,如果字符串是Unicode编码的,则长度值前面是3字节0xFF 0xFFFE标记.因此,在任何组合中,您将永远不会看到4字节长度,因此您显示的必须是0x00属于其他内容的3 个字节,后跟1个字节的字符串长度0x29.

因此,读取字符串的正确方法如下:

假设:除非另有说明,否则字符串数据为Ansi.

  1. 读一个字节.如果其值<255,则字符串长度为值goto 3.

  2. 读一个字.如果其值为0xFFFE,则字符串数据为Unicode,转到1.否则,如果其值为<65535,则字符串长度为其值,转到3.否则,读取dword,字符串长度为其值,转到3.

  3. 读取字符串长度为8位或16位的值,具体取决于字符串是Ansi还是Unicode,然后根据需要转换为所需的编码.