Чтение массива структуры из двоичных данных, сохраняемых CArchive

Я пытаюсь прочитать данные из файла, который записывается CArchive. У меня есть оригинальный источник, который используется для чтения и записи с помощью CArchive. Но я пытаюсь прочитать это через код C#. Я могу прочитать большую часть файла, но я застрял, когда мне нужно прочитать массив struct, записанный в файле.

Я видел другие вопросы по stackru, но они не работали для меня.

Читать бинарный файл в структуру

Чтение структуры данных 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;
};

Crchive Читать код:

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

Теперь после этого вызова, когда я проверяю structCollection, данные узлов не верны. Для шестой структуры в коллекции значения для двух полей равны 256, а после 7-й или 8-й структуры все поля равны 256. Теперь это неверные данные. Я прочитал это через код C++, и это работало нормально. Значение поля либо 1, либо 0, но 256 данных абсолютно недействительны.

1 ответ

Ваша структура C++ является битовым полем. Это займет одно слово /ushort по содержанию.

Ваша версия C# использует 9 коротких строк, которые вы, кажется, читали эту длину.

Другие вопросы по тегам