Я пытаюсь читать двоичные данные, используя C #. У меня есть вся информация о расположении данных в файлах, которые я хочу прочитать. Я могу прочитать данные «чанк за чанк», то есть получить первые 40 байтов данных, преобразовав их в строку, получить следующие 40 байтов.
Поскольку существует как минимум три слегка отличающиеся версии данных, я хотел бы прочитать данные непосредственно в структуру. Это кажется гораздо более правильным, чем читать «построчно».
Я пробовал следующий подход, но безрезультатно:
StructType aStruct;
int count = Marshal.SizeOf(typeof(StructType));
byte[] readBuffer = new byte[count];
BinaryReader reader = new BinaryReader(stream);
readBuffer = reader.ReadBytes(count);
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType));
handle.Free();
Поток - это открытый FileStream, из которого я начал читать. Я получаю AccessViolationExceptio
n при использовании Marshal.PtrToStructure
.
Поток содержит больше информации, чем я пытаюсь прочитать, так как меня не интересуют данные в конце файла.
Структура определяется как:
[StructLayout(LayoutKind.Explicit)]
struct StructType
{
[FieldOffset(0)]
public string FileDate;
[FieldOffset(8)]
public string FileTime;
[FieldOffset(16)]
public int Id1;
[FieldOffset(20)]
public string Id2;
}
Код примеров изменен с исходного, чтобы этот вопрос был короче.
Как бы я прочитал двоичные данные из файла в структуру?