Записывать структуру переменной длины 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 }
Примечания:байт имеет тот же размер, что и символ char.
Когда вы читаете из двоичного файла, вы можете прочитать первые 4 байта (int равен 32, то есть 4 байта) и выделить 4 + (прочитанная длина), после чего вы можете читать непосредственно в выделенный буфер и обрабатывать как структуру.
Другие советы
В структуре нет такого понятия, как массив переменной длины.
Предположим, у меня была структура point
такие , как
struct point
{
int x;
int y;
}
Если бы мне нужен был массив из 5 таких элементов, компилятор, по сути, зарезервировал бы место для 10 целых чисел.Что произойдет, если я запрошу массив структур, каждая из которых содержит массив переменной длины?Нет никакого способа выровнять их в памяти, так как мы не можем знать, сколько места зарезервировать для каждого из них.
Что ты может сделать - это объявить указатель к типу, для которого вам нужен массив переменной длины, потому что указатель имеет постоянный размер.Затем вы выделяете достаточно памяти для любого количества экземпляров этого типа и указываете на него таким образом.Вероятно, вам также нужно будет добавить length
поле в структуру, чтобы вы точно знали, как далеко вы можете пройти мимо указателя, прежде чем рискуете нарушить сегментацию.
Возможно, будет немного сложно переключаться между управляемым и неуправляемым кодом и выделять и освобождать память, но это еще одно хорошее упражнение для совместного изучения C ++ и C #, если уж на то пошло.
Используйте Marshall.StructToPtr и скопируйте длину структуры.