Frage

Okay, also bin weiterhin ich auf meinem kleinen Spiel-Engine zu arbeiten, mich zu unterrichten C # / C ++ mehr. Jetzt bin ich versuche, einen Weg zum Speichern von Daten in einem binären Format zu schreiben, die ich schaffte. (Dies ist das Lernen, ich möchte diese von Grund auf mich selbst tun). Was ich frage mich, was ist der beste Weg, um mit variabler Länge Arrays innerhalb einer Struktur zu tun, wenn es in C ++ lesen?

z. Hier ist, was ich zur Zeit für meine Strukturen haben:

 [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;
    }

Nun, wie würde ich über in C ++ gehe dazu tatsächlich eingelesen als Struktur in C ++? Ich war irgendwie gehofft, zu erhalten um jeden der Elemente eines nach dem anderen zu lesen und kopiert sie in eine Struktur.

Das einzige wirkliche Tutorial ich auf diese gefunden ist dies: http://www.gamedev.net/community/forums/topic.asp?topic_id=310409&whichpage=1�

Ich werde eine wilde Vermutung nehmen und sagen, dass dies in eine C ++ Lesen Struktur nicht wirklich möglich ist richtig?

War es hilfreich?

Lösung

Sie können es von Binärformat Mapping eine Kopie dieser Strukturen lesen. Jedes Array sollte als Zeiger behandelt werden und Sie sollen eine ganze Zahl mit einer Größe von Array.

Zum Beispiel in

C #

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

C ++

    struct A {
        int length
        char* vector
    }

Weitere Informationen: Byte hat die gleiche Größe von char

.

Wenn Sie von einem binären lesen können Sie die ersten 4 Byte gelesen (int 32 aka 4 Byte) und zuteilen 4 + (readed Länge) nach, dass Sie direkt mit dem zugewiesenen Puffer lesen kann und als eine Struktur zu behandeln.

		

Andere Tipps

Es gibt nicht so etwas wie eine variable Länge Array in einer Struktur.

Angenommen, ich eine Struktur point hatte wie

struct point
{
    int x;
    int y;
}

Wenn ich ein Array von 5 davon wollte, würde der Compiler reservieren im Wesentlichen Platz für 10 ints. Was passiert, wenn ich für eine Reihe von Strukturen stellen, von denen jedes eine variable Länge Array enthält? Es gibt keine Möglichkeit, die im Speicher auszurichten, da wir nicht wissen können, wie viel Platz für jeden zu reservieren.

Was Sie können tun, ist ein Zeiger auf die Art zu erklären, von denen Sie eine variable Länge Array wollen, weil ein Zeiger eine konstante Größe ist. Dann ordnen Sie genügend Speicher für jedoch viele Fälle dieser Art, und der Punkt, um es auf diese Weise. Sie werden wahrscheinlich müssen auch ein length Feld auf die Struktur hinzufügen, damit Sie genau wissen, wie weit kann man den Zeiger geht vorbei, bevor Sie Speicherzugriffsfehler riskieren.

Es könnte ein wenig haarig hin und her zwischen verwalteten und nicht verwalteten Code zu gehen und die Zuweisung und Speicher freigegeben werden kann, aber das ist eine andere gute Übung für das Lernen C ++ und C # zusammen, wenn überhaupt.

Verwenden Marshall.StructToPtr und Kopie Länge der Struktur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top