1

さて、私は自分の小さなゲーム エンジンに取り組み続けて、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++でどのようにすればよいでしょうか。各要素を 1 つずつ読み取り、それらを構造体にコピーすることを回避したいと思っていました。

これについて私が見つけた唯一の実際のチュートリアルはこれです: http://www.gamedev.net/community/forums/topic.asp?topic_id=310409&whichpage=1婐

私は大げさな推測をして、これを C++ 構造に読み込むことは実際には不可能だと言いますか?

4

3 に答える 3

2

構造体には可変長配列のようなものはありません。

私が次のpointような構造を持っていたとしましょう

struct point
{
    int x;
    int y;
}

これらのうち5つの配列が必要な場合、コンパイラーは基本的に10intのスペースを予約します。それぞれが可変長配列を含む構造体の配列を要求するとどうなりますか?それぞれに予約するスペースがわからないため、メモリ内でそれらを整列させる方法はありません。

ポインタは定数サイズであるため、可変長配列が必要なタイプへのポインタを宣言することができます。次に、そのタイプのインスタンスの数に応じて十分なメモリを割り当て、そのようにポイントします。おそらく、構造体にフィールドを追加して、セグフォールトのリスクを冒す前に、ポインターをどこまで通過できるかを正確に把握する必要があります。length

マネージドコードとアンマネージドコードの間を行き来したり、メモリを割り当てたり解放したりするのは少し面倒かもしれませんが、それはC ++とC#を一緒に学ぶためのもう1つの良い演習です。

于 2009-09-19T19:02:26.403 に答える
0

これらの構造のコピーをマッピングするバイナリ形式から読み取ることができます。各配列はポインターとして扱われ、この配列のサイズを持つ整数が必要です。

たとえば、

C#

    [StructLayout(LayoutKind.Sequential)]
    パブリック構造体 A
    {
        public Int32 m_CheckSumLength;
        パブリック バイト[] m_Checksum;
    }

C++

    構造体 A {
        整数の長さ
        char* ベクトル
    }

注: byte は char と同じサイズです。

バイナリから読み取る場合、最初の 4 バイト (int は 32 別名 4 バイト) を読み取り、その後 4 + (読み取った長さ) を割り当てることができます。その後、割り当てられたバッファーを直接読み取り、A 構造体として扱うことができます。


    
于 2009-09-19T19:29:41.857 に答える
0

Marshall.StructToPtr を使用し、構造体の長さをコピーします。

于 2009-09-19T18:10:47.380 に答える