Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
|
||||||
1 | ||||||
C# и бинарники21.07.2012, 13:17. Показов 3872. Ответов 18
Метки нет (Все метки)
Ребята есть проблема.
Как в бинарник записать несколько классов,а потом считать только один определенный(например 5).То-есть читать не последовательно до 5,а Seek'ом с позиции. ___________________________________________ например такая структура или класс такой же
И еще,реально ли узнать размер класса(структуры) в байтах,если используется string? //маршалинг и sizeof размер !!!экземпляра!! не показывает
0
|
21.07.2012, 13:17 | |
Ответы с готовыми решениями:
18
Конвертировать exe в бинарники Linux Не запускаются бинарники из консоли (детский сад) Пути, куда складывать готовые бинарники Где можно выложить freeware бинарники ? |
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
21.07.2012, 18:30 | 2 |
Используйте метод Seek потока данных.
Но вам придется ограничить максимальный размер экземпляра, если вы хотите воспользоваться таким методом. Размер структуры или класса - это, грубо говоря, сумма размеров его полей. В вашем примере размер структуры STUDENT будет 128 или 224 байт, в зависимости от того, на какой системе она используется: x86 или x64. Даже если fio ссылается на текст размером в 20Мб, размер структуры все равно останется тот же. О чем вам с радостью сообщит оператор sizeof. Ну, можете в самой структуре создать метод, где будет подсчитываться общее количество памяти, занимаемой всеми объектами, на которые ссылаются ее поля.
1
|
Почетный модератор
|
|
21.07.2012, 20:14 | 3 |
kolorotur, размер структуры будет 16 и 24 байта для 32 и 64 битного процесса соответственно, тут string это ссылка (OBJREF).
Noob.net, добавьте в структуру 4 поля типа int: длина в байтах всей структуры и длина каждого поля типа string, тогда когда будете читать файл прыгайте (смещайтесь) по файлу используя общий размер структуры.
1
|
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
|
||||||
21.07.2012, 22:09 [ТС] | 5 | |||||
Нет нужны бинарные файлы так как на 1 место быстродействие и минимизация занимаемой памяти
(понимаю не совсем к шарпу,но здесь другие мотивы и плюсы) вот здесь например string час-мин 1 1 true = 18 байт= (описание строки)1байт + 14(? что тут?) + (ushort)1байт + (byte)2 байта + (bool)1 байт а структура занимает 12 байт через Маршал.СайзОфф - так как стринг ссылка только метод всегда показывает размер ссылки стринга а записывается то само значение "класса" насколько я понимаю. спасибо) реально за 2 дня не нашел хотя бы намека на это,а сам не догадаюсь=( тоесть у меня будет что-то типа
возможно ли обойтись без unmanaged кода?
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
21.07.2012, 22:15 | 6 |
Ну разумеется - это я цифру написал в битах, а подписал как байты (16*8=128, 28*8=224)
Только на х64 будет не 24 байта, а 28 (+4 на инт). Разумеется, потому я и пишу о создании отдельного метода, который будет считать количество байт, занимаемых каждой строкой при кодировке UTF-16. Возможно. Но, повторюсь, вам придется сделать размер структуры фиксированным, ограничив максимальное количество символов в каждой строке. В самой структуре можно вообще хранить char[], а открытыми сделать свойства, в акцессорах которых будет происходить конвертирование из строки в массив символов фиксированной длины.
1
|
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
|
||||||
21.07.2012, 22:36 [ТС] | 7 | |||||
не проблема,макс размер строки известен.Думал хранить в char[]
+ исп свойства так как будет привязка данных То-есть если я буду иметь массивы фикс длины,инты,булы и т.д они в байтах займут именно столько - сколько весят,как описано в структуре МДСН?
размер структуры в бинарнике будет занимать ровно 34 байта? //промежуточный вопрос,Строка == массив чаров или массив + размер? Насчет кодировки,не важно что я выберу или есть какие-то рекомендации? например в делфях пользовались АНСИ при такой же структуре, а здесь например взять ЮТФ - 8,юникод думаю лучше не трогать изза (1символ - 2 байта) Добавлено через 2 минуты Можно еще вопросик? Вот я достану эти структуры(все в определенном случае),где мне лучше их хранить в потоке памяти или можно пользоваться чем-то проще,например List посоветуйте,пожалуйста)
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
22.07.2012, 00:21 | 8 |
Так точно. Исключение - массивы char, но только в том случае, если вы хотите использовать другую кодировку. По умолчании при сериализации используется UTF-16, где 2 байта на символ.
Эм, что за интересные методы? Реализуйте эти массивы в кишках структуры и сериализируйте сразу всю структуру - не занимайтесь ерундой На примере волшебных методов выше - 64 Если вы о классе System.String, то ни то, ни другое. В шарпе строки - не совсем то же самое, что в сях. Для сериализации в бинарный файл лучше используйте UTF-16 - не так экономно по месту, как UTF-8, но зато размер символа всегда известен - можно обращаться к отдельным символам в файле, не напрягаясь. АНСИ - довольно расплывчатое понятие В эту категорию входит масса разных кодировок. А в UTF-8 - от одного до четырех байт на символ, так что в некоторых случаях в файле можно будет хранить строки в два раза короче чем те, которые можно было бы сохранить в UTF-16. Всегда рассматривайте поток, как место, куда данные отсылаются или откуда считываются, но не как постоянное хранилище. Так что List, ага.
1
|
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
|
|
22.07.2012, 00:39 [ТС] | 9 |
=) Кодировка была другая) 34байта) или ваш вариант в другой) спасибо)
О строках я понял что это ссылочный тип(пересоздаеться каждый раз и бла бла),а с ваших слов - что ранее читаемая мной инфа была ложью Разве шарп разрешает сериализовать всю структуру сразу? 0_о то-есть,я могу через Бин-Ридер записать сразу всю структуру,а не каждое поле отдельно? (пример был правильный,там методика другая была) - хотел убедиться в размере) (если по 2 байта - 64) Или вы имели ввиду заменить "левые методы" сразу на _методы структуры или свойства_? //тогда вопрос закрыт) а если я ошибаюсь,то -> Что бы сериализовать целую структуру мне нужна реализовать интерфейс или можно пихать в writer? Ведь обычной сереализацией\десереализацией здесь не обойдешься так как она пихает много лишней инфы,а нужен минимальный размер. З.Ы. Если наглею - извините,в mdsn сухая инфа,в нете мало,вот на форумах только и есть возможность "живого общение".
0
|
Почетный модератор
|
||||||
22.07.2012, 00:57 | 10 | |||||
Не по теме: kolorotur, да, обсчитался )
1
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
22.07.2012, 00:57 | 11 |
В смысле "другая"?
Если возвращается массив char, как написано в комментарии, то используется UTF-16, а значит 2 байта на символ. Конечно. Можно использовать BinaryFormatter, например. Правда, он добавляет несколько лишних байт для информации о типе. Ага, именно это. В этом случае можно тупо замаршаллить структуру в массив байтов и уже этот массив так же тупо записывать в файл - никакой лишней информации.
2
|
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
|
||||||||||||||||
22.07.2012, 06:42 | 12 | |||||||||||||||
Вот класс, писал для себя но с вами естественно поделюсь, маршалит структуру в массив байт и обратно
2
|
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
|
|
22.07.2012, 13:41 [ТС] | 13 |
Всем спасибо)
Очень помогли) сегодня спал спокойно Добавлено через 3 часа 3 минуты При маршаллинге я так понимаю скорость работы с бинарником упадет? И если я начинаю писать с определенного байта в файле то я перезаписываю последующие байты или дописываю перед ними новые?
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
22.07.2012, 13:47 | 14 |
1
|
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
|
||||||||||||
22.07.2012, 20:28 [ТС] | 15 | |||||||||||
Опять теряю байты..
0
|
Почетный модератор
|
|||||||||||
22.07.2012, 20:37 | 16 | ||||||||||
0
|
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
|
|
22.07.2012, 20:44 [ТС] | 17 |
То-есть происходит выравнивание последнего типа?
Добавлено через 1 минуту Есть еще нюансы с какими-то типами которые следует знать? Или лучше каждое поле отмечать Маршалом?
0
|
Почетный модератор
|
|
22.07.2012, 20:53 | 18 |
Noob.net, оно не выравнивается, размер bool при маршалинге равен 4 байтам по умолчанию(, т.е. соответствует типу BOOL в Win32).
На счет особенностей как таковых (для себя) нюансов не замечал, наверное только баг, я его описывал здесь, в разделе 4.3 StructLayout.
1
|
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
|
|
22.07.2012, 20:57 [ТС] | 19 |
Спасибо) не нашел так бы)
0
|
22.07.2012, 20:57 | |
22.07.2012, 20:57 | |
Помогаю со студенческими работами здесь
19
Как (скриптом?) загнать в акцесс несколько тысяч картинок (бинарники)? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |