gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:33 27 4
gpt4 key购买 nike

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

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

不过,我对某些数据仍然很模糊。如何读取日期数据? float 、整数、 double 等怎么样?

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

04 31 2e 31 30

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

00 00 00 29

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

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

最佳答案

要回答有关字符串的问题,存储在存档中的长度值本身是可变长度的,具体取决于字符串的长度和编码。如果字符串是 < 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. 读取一个字节。如果其值为<255,则字符串长度为该值,转到3。

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

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

关于c++ - C++ MFC 对象 CArchive 写入的文件格式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8932214/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com