Немного поизучав структуры понял что это жутко удобно, и переписал большую часть кода под них. В качестве расширения для BinaryReader использовал вот эту функцию взятую вроде из кода спеллворка:
Код:
public static T ReadStruct<T>(this BinaryReader reader) where T: struct
{
GCHandle handle = GCHandle.Alloc(reader.ReadBytes(Marshal.SizeOf(typeof(T))), GCHandleType.Pinned);
T local = (T) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
handle.Free();
return local;
}
Собственно все хорошо, но появилась проблема с сишными строками. Как я понял в шарпе строки не заканчиваются нулевым байтом, поэтому Marshal.SizeOf(typeof(T)) возвращает на 1 байт меньше чем требуется. Поэтому вопрос: каким образом ему можно указать что строка сишная, и её обрабатывать например тем же расширением ReadCString()?