c # — чтение массива структуры из двоичных данных, сохраненных CArchive

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

Я видел другие вопросы по 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;
};

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 данных абсолютно недействительны.

0

Решение

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

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

0

Другие решения

Других решений пока нет …