Записывать структуру переменной длины C # в двоичный файл и считывать ее в C ++?

StackOverflow https://stackoverflow.com/questions/1449125

  •  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 и скопируйте длину структуры.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top