1

好的,所以我将继续在我的小游戏引擎上工作,以教我更多 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婐

我会大胆猜测并说将其读入 C++ 结构是不可能的吗?

4

3 回答 3

2

结构中没有变长数组这样的东西。

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

struct point
{
    int x;
    int y;
}

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

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

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

于 2009-09-19T19:02:26.403 回答
0

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

于 2009-09-19T18:10:47.380 回答
0

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

例如在

C#

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

C++

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

注意: byte 与 char 大小相同。

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


    
于 2009-09-19T19:29:41.857 回答