【问题标题】:Writing a C# Variable Length Structure to Binary and Reading it in in C++?将 C# 可变长度结构写入二进制并用 C++ 读取?
【发布时间】:2009-09-19 18:06:23
【问题描述】:

好的,所以我将继续在我的小游戏引擎上工作,以教我更多 C#/C++。现在我正在尝试编写一种以我创建的二进制格式存储数据的方法。 (这是学习,我想自己从头开始)。我想知道在 C++ 中读取结构中的可变长度数组时,处理它的最佳方法是什么?

例如这是我目前的结构:

 [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryHeader
    {
        public Int32 m_CheckSumLength;
        public byte[] m_Checksum;
        public Int32 m_NumberOfRecords;
        public FooBinaryRecordHeader[] m_BinaryRecordHeaders;
        public FooBinaryRecord[] m_BinaryRecords;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryRecordHeader
    {
        public Int32 m_FileNameLength;
        public char[] m_FileName;
        public Int64 m_Offset;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryRecord
    {
        public bool m_IsEncrypted;
        public Int64 m_DataSize;
        public byte[] m_Data;
    }

现在我将如何在 C++ 中实际将其作为 C++ 中的结构读入?我有点希望能够一一阅读每个元素并将它们复制到一个结构中。

我找到的唯一真正的教程是:http://www.gamedev.net/community/forums/topic.asp?topic_id=310409&whichpage=1&#1989200

我会大胆猜测一下,将其读入 C++ 结构真的不可能正确吗?

【问题讨论】:

    标签: c# c++ binaryfiles


    【解决方案1】:

    结构中不存在可变长度数组。

    假设我有一个结构point,例如

    struct point
    {
        int x;
        int y;
    }
    

    如果我想要一个由 5 个组成的数组,编译器基本上会为 10 个整数保留空间。如果我要求一个结构数组,其中每个都包含一个可变长度数组,会发生什么?无法在内存中对齐它们,因为我们不知道为每个保留多少空间。

    可以做的是声明一个指针指向你想要一个可变长度数组的类型,因为指针是一个常量大小。然后,您为该类型的许多实例分配足够的内存,并以这种方式指向它。您可能还需要在结构中添加一个 length 字段,这样您就可以准确地知道在冒段错误风险之前您可以通过指针多远。

    在托管和非托管代码以及分配和释放内存之间来回切换可能会有点麻烦,但如果有的话,这是一起学习 C++ 和 C# 的另一个很好的练习。

    【讨论】:

      【解决方案2】:

      您可以从二进制格式中读取它映射这些结构的副本。每个数组都应该被视为一个指针,并且您应该有一个与该数组大小相同的整数。

      例如在

      C#

      [StructLayout(LayoutKind.Sequential)] 公共结构 A { 公共 Int32 m_CheckSumLength; 公共字节[] m_Checksum; }

      C++

      结构 A { 整数长度 字符 * 向量 }

      注意:byte 与 char 大小相同。

      当您从二进制文件中读取时,您可以读取前 4 个字节(int 是 32 也就是 4 个字节)并分配 4 +(读取长度),之后您可以直接读取分配的缓冲区并将其视为 A 结构。

      【讨论】:

        【解决方案3】:

        使用 Marshall.StructToPtr 并复制结构的长度。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-22
          • 1970-01-01
          • 1970-01-01
          • 2012-05-16
          • 1970-01-01
          • 2018-11-03
          • 1970-01-01
          • 2014-02-09
          相关资源
          最近更新 更多