Я пытаюсь прочитать данные из файла, который записывается 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 данных абсолютно недействительны.
Ваша структура C ++ является битовым полем. Это займет одно слово / ushort по содержанию.
Ваша версия на C # использует 9 коротких строк, которые вы, кажется, читаете в этой длине.
Других решений пока нет …