Rédaction d'un C # Structure de longueur variable binaire et à la lecture en C ++?

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

  •  11-09-2019
  •  | 
  •  

Question

D'accord, donc je continue à travailler sur mon petit moteur de jeu pour me apprendre C # / C ++ plus. Maintenant, je vais tenter d'écrire une façon de stocker des données dans un format binaire, que j'ai créé. (Ceci est d'apprendre, je veux faire mon auto à partir de zéro). Ce que je me demande quelle est la meilleure façon de traiter avec des tableaux de longueur variable à l'intérieur d'une structure lors de la lecture en C ++?

par exemple. 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 ++? Je suis un peu l'espoir d'obtenir la lecture autour de chacun des éléments un par un et les copier 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�

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

Était-ce utile?

La solution

Vous pouvez lire de la cartographie format binaire une copie de ces structures. Chaque tableau doit être traité comme un pointeur et vous devez avoir un nombre 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
    }

Notes: octet a la même taille de charbon

.

Quand on lit à partir d'un binaire on peut lire les 4 premiers octets (int est de 32 aka 4 octets) et allouer 4 + (longueur readed) après que vous pouvez lire directement au tampon alloué et traiter en une structure.

		

Autres conseils

Il n'y a pas une telle chose comme un tableau de longueur variable dans une structure.

Supposons que j'avais une structure point telle que

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. Qu'est-ce qui se passe si je demande un tableau de structures, dont chacun contient un tableau de longueur variable? Il n'y a aucun moyen d'aligner ceux en mémoire puisque nous ne pouvons pas savoir à quel point l'espace à réserver pour chacun.

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

Il pourrait être un peu poilu va et vient entre le code managé et non géré et allouer et libérer de la mémoire, mais c'est un bon exercice pour apprendre le C ++ et C # ensemble, si quelque chose.

Utilisation Marshall.StructToPtr et durée de la copie de la structure.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top