好的,我将继续开发我的小游戏引擎来教我更多 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#

    [StructLayout(LayoutKind.Sequential)]
    public struct A
    {
        public Int32 m_CheckSumLength;
        public byte[] m_Checksum;
    }

C ++

    struct A {
        int length
        char* vector
    }

注意:字节具有炭的相同尺寸

当你从二进制读可以读取第一4字节(int是32又名4字节)和之后分配4 +(readed长度),则可以直接读取到分配的缓冲区和当作一个的结构。

		

其他提示

有没有这样的事情如在结构的可变长度的数组。

假设我有一个结构point

struct point
{
    int x;
    int y;
}

如果我想的的这5个阵列,则编译器将基本上保留空间10个整数。如果我问了一个结构数组,其中每个包含可变长度数组会发生什么?有没有办法对准那些在内存中,因为我们无法知道多少空间预留为每一个。

什么能做是声明一个指针到的要一个可变长度数组,因为一个指针是一个恒定大小的类型。然后,您分配该类型的但是很多情况下足够的内存,并指向它的方式。您可能会需要也length字段添加到结构让你清楚知道你能走多远过去的指针,你的风险之前,段错误。

这可能会有点毛茸茸的托管和非托管代码分配和释放内存之间来回,但这是另一个很好的锻炼学习C ++和C#一起,如果有的话。

使用Marshall.StructToPtr和结构的副本长度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top