Я пытаюсь читать двоичные данные с помощью С#. У меня есть вся информация о макете данных в файлах, которые я хочу прочитать. Я могу читать данные "chunk by chunk", то есть получать первые 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;
}
Код примеров изменен с оригинала, чтобы сделать этот вопрос короче.
Как я буду читать двоичные данные из файла в struct?