Я пытаюсь читать двоичные данные с помощью C#. У меня есть вся информация о макете данных в файлах, которые я хочу прочитать. Я могу читать данные «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, из которого я начал читать. При использовании Marshal.PtrToStructure
я получаю AccessViolationExceptio
.
В потоке содержится больше информации, чем я пытаюсь прочитать, так как меня не интересуют данные в конце файла.
структура определяется как:
[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;
}
Код примеров изменяется от оригинала, чтобы сделать этот вопрос короче.
Как бы я прочитал двоичные данные из файла в структуру?
BinaryFormatter имеет свой собственный формат для двоичных данных - это нормально, если вы сами читаете/записываете данные. не полезно, если вы получаете файл из другого источника. – russau 2009-07-26 07:11:52