0

CArchive によって書き込まれているファイルからデータを読み込もうとしています。CArchiveを使用して読み書きするために使用されている元のソースがあります。しかし、私はこれを C# コードで読み取ろうとしています。ファイルの大部分は読めるのですが、ファイルに書かれている構造体の配列を読まないといけなくなって行き詰まりました。

stackoverflow に関する他の質問を見たことがありますが、うまくいきませんでした。

バイナリ ファイルを構造体に読み込む

バイト配列から C# で C/C++ データ構造を読み取る

彼らが提案したのは、この機能を使用することです。

public static T ByteToType<T>(BinaryReader reader)
{
    byte[] bytes = reader.ReadBytes(Marshal.SizeOf(typeof(T)));

    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    T theStructure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    handle.Free();

    return theStructure;
}

しかし、これは私にとってはうまくいきません。

だからここに私のC++コードがあります:

構造:

struct MyStruct
{
    WORD field1 : 1;
    WORD field2 : 1;
    WORD field3 : 1;
    WORD field4 : 1;
    WORD field5 : 1;
    WORD field6 : 1;
    WORD field7 : 1;
    WORD field8 : 1;
    WORD field9 : 1;
};

CArchive 読み取りコード:

m_data = new MyStruct[3600];
cArchiveReader.Read(m_data, 3600 * sizeof(MyStruct));

今C#コード:

私の構造体

public struct MyStruct
{
    ushort field1;
    ushort field2;
    ushort field3;
    ushort field4;
    ushort field5;
    ushort field6;
    ushort field7;
    ushort field8;
    ushort field9;
}

**Reading Code:**

var stream = new MemoryStream(bytes);
var reader = new BinaryReader(stream);
for (int I=0; I<3600; I++)
{
    structureCollection.Add(ByteToType<NodeFlag>(reader));
}

この呼び出しの後、structureCollection を確認すると、ノード データが正しくありません。コレクションの 6 番目の構造体の 2 つのフィールドの値は 256 で、7 番目または 8 番目の構造体以降はすべてのフィールドが 256 です。これは間違ったデータです。これを C++ コードで読みましたが、問題なく動作しました。フィールド値は 1 または 0 ですが、256 データは完全に無効です。

4

1 に答える 1