【问题标题】:What is the file format that the C++ MFC object CArchive writes to?C++ MFC 对象 CArchive 写入的文件格式是什么?
【发布时间】:2012-01-19 19:39:39
【问题描述】:

我正在尝试用 C# 读入一个用 CArchive 编写的文件。据我所知,格式是:

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

不过,我对某些数据仍然很模糊。如何读取日期数据?浮点数、整数、双精度数等呢?

此外,[下一组数据的长度] 可以是字节、字或双字。我怎么知道什么时候会出现?例如,对于字符串“1.10”,数据为:

04 31 2e 31 30

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

00 00 00 29

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

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

【问题讨论】:

  • 我不知道它是否在任何地方都被正式指定——假设你也会使用 CArchive 来读回它。代码本身就是文档。

标签: c++ format carchive


【解决方案1】:

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

所以,读取字符串的正确方法如下:

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

  1. 读取一个字节。如果它的值

  2. 读一个单词。如果它的值是0xFFFE,字符串数据是Unicode,转到1。否则,如果它的值

  3. 根据字符串是Ansi还是Unicode,读取8bit或16bit值的字符串长度数,然后根据需要转换为所需的编码。

【讨论】:

  • "1.读取一个字节。如果它的值
  • 仔细阅读我写的内容。步骤#1 中的比较不包括 255 本身。长度为 255 的字符串将落入第 2 步,以 0xFF 标记开头,后跟 2 字节的 WORD 值 255。
【解决方案2】:

根据the documentation

主要的 CArchive 实现可以在 ARCCORE.CPP 中找到。

如果您没有 MFC 源,请参阅 this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2012-06-06
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多