Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> читка структур методом Marshal 
:(
    Опции темы
megel
Дата 7.8.2008, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 31.5.2008

Репутация: нет
Всего: нет



Вот мой код, reader это Binary Reader 

 
Код

      public struct Test
        {
            public char n;
            public char b;
            public char c;
            public char a;
        }

        static BinaryReader reader;

        static void Main(string[] args)
        {
            FileStream stream = new FileStream("data.txt", FileMode.Open);
            reader = new BinaryReader(stream);

            Test test;

            test = (Test)Read(typeof(Test));
        }

        public static object Read(Type type)
        {
            int size = Marshal.SizeOf(type);

            byte[] buffer = reader.ReadBytes(size);

            IntPtr ptr = Marshal.AllocHGlobal(size);

            for (int i = 0; i < size; i++)
                Marshal.WriteByte(ptr, i, buffer[i]);

            object temp = Marshal.PtrToStructure(ptr, type);

            Marshal.FreeHGlobal(ptr);

            return temp;
        }


два вопроса - 

можно ли таким образом читать структуры с масивами
ведь нельзя поставить char a[10];
можно токо char[] a = new char[10];

сильно ди будет медленее(или быстрее) читаться структуры по сравнению с чтением каждого параметра по отдельности ???




PM MAIL   Вверх
mihryak
Дата 7.8.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



не силён в маршалинге, но по крайней мере для массивов определённой длины можно задать атрибут MarshalAs
Код

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] // 2 здесь - кол-во символов в массиве
            public char[] b;

про скорость тоже не отвечу, но читать из файла в любом случае стоит блоками

PM MAIL ICQ   Вверх
megel
Дата 8.8.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 31.5.2008

Репутация: нет
Всего: нет



спасибо.

только не понял -

Цитата

но читать из файла в любом случае стоит блоками


это всмысле читать обычным способом - каждую переменную binary reader'om ?


PM MAIL   Вверх
mihryak
Дата 8.8.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(megel @  8.8.2008,  13:28 Найти цитируемый пост)
это всмысле читать обычным способом - каждую переменную binary reader'om ?

не это я к тому, что побайтовое чтение из файла - не лучший вариант, да, всё равно блоками система читать будет, есть упреждающая выборка, но всё равно лучше на них не полагаться и считывать самостоятельно крупный блок данных в поток в памяти, из которого уже читать BinaryReader'ом
пс. если производительность не настолько критична, то не бери вообще в голову
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.