2009-09-19 8 views
1

Ok, donc je continue à travailler sur mon petit moteur de jeu pour m'apprendre plus de C#/C++. Maintenant j'essaye d'écrire un moyen de stocker des données dans un format binaire, que j'ai créé. (Ceci est l'apprentissage, je veux le faire mon moi à partir de zéro). Qu'est-ce que je me demande quelle est la meilleure façon de traiter les tableaux de longueur variable à l'intérieur d'une structure lors de la lecture en C++?Écrire une structure de longueur variable C# en binaire et la lire en C++?

E.g. Voici ce que j'ai actuellement mes structures:

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

Maintenant, comment pourrais-je aller sur en C++ pour lire réellement ceci en tant que structure en C++? J'espérais un peu me débrouiller en lisant chacun des éléments un par un et en les copiant dans une structure.

Le seul tutoriel vrai que j'ai trouvé sur ce point est ceci: http://www.gamedev.net/community/forums/topic.asp?topic_id=310409&whichpage=1&#1989200

Je vais prendre une conjecture sauvage et dire lire ceci dans une structure C++ n'est pas vraiment possible correcte?

Répondre

0

Vous pouvez le lire à partir du format binaire mappant une copie de ces structures. Chaque tableau doit être traité comme un pointeur et vous devriez avoir un entier avec la taille de ce tableau.

Par exemple dans

C#

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

C++
 
    struct A { 
     int length 
     char* vector 
    } 

Remarques: octet a la même taille de charbon. Lorsque vous lisez à partir d'un binaire, vous pouvez lire le premier 4 octets (int est 32 alias 4 octets) et allouer 4 + (longueur lue) après que vous pouvez lire directement dans le tampon alloué et traiter comme une structure A.

 
0

Utilisez Marshall.StructToPtr et copiez la longueur de la structure.

+0

Pouvez-vous expliquer plus? – UberJumper

2

Il n'existe pas de tableau de longueur variable dans une structure.

Supposons que j'avais une structure telle que point

struct point 
{ 
    int x; 
    int y; 
} 

Si je voulais un tableau 5 de ceux-ci, le compilateur réserve essentiellement l'espace pour 10 ints. Que se passe-t-il si je demande un tableau de structures, dont chacune contient un tableau de longueur variable? Il n'y a aucun moyen d'aligner ceux en mémoire puisque nous ne pouvons pas savoir combien d'espace réserver pour chacun d'entre eux.

Qu'est-ce que vous pouvez faire est de déclarer un pointeur du type dont vous voulez un tableau de longueur variable, parce qu'un pointeur est une taille constante. Ensuite, vous allouez suffisamment de mémoire pour toutes les instances de ce type, et vous le pointez de cette façon. Vous aurez probablement besoin d'ajouter également un champ length à la structure afin que vous sachiez exactement jusqu'où vous pouvez aller au-delà du pointeur avant de risquer une segfaulting.

Il peut être un peu difficile entre le code géré et non géré et l'allocation et la libération de la mémoire, mais c'est un autre bon exercice pour apprendre C++ et C# ensemble, si quoi que ce soit.

Questions connexes