将 C# 可变长度结构写入二进制并在 C++ 中读取它?
-
11-09-2019 - |
题
好的,我将继续开发我的小游戏引擎来教我更多 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++ 结构实际上不可能正确吗?
解决方案
可以从二进制格式映射阅读这些结构的副本。每个阵列应被视为一个指针和你应该有与该阵列的尺寸的整数。
例如在
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和结构的副本长度。