Показать сообщение отдельно
Старый 15.04.2011, 12:16   #1
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию BinaryReader и расширение ReadStruct [C#]

Немного поизучав структуры понял что это жутко удобно, и переписал большую часть кода под них. В качестве расширения для 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()?
HuntsMan вне форума   Ответить с цитированием