|
14 / 18 / 5
Регистрация: 13.04.2011
Сообщений: 148
|
||||||
Преобразование класса в массив байт19.07.2013, 07:18. Показов 14612. Ответов 15
Метки нет (Все метки)
Доброго времени суток!
Задача следующая. Через сокет приходит пакет данных в виде байтового массива (datagrab). На серверном приложении до преобразования, пакет существует в виде класса аналог которого на C# будет выглядеть примерно так:
У меня проблема с преобразованием. Просто один тип преобразовать проблем не возникает, а вот с классом не понятно как дело обстоит. За ранее благодарю.
0
|
||||||
| 19.07.2013, 07:18 | |
|
Ответы с готовыми решениями:
15
Преобразование уинт\инт числа в байт массив Преобразование MD5 в массив байт |
|
57 / 57 / 11
Регистрация: 04.03.2010
Сообщений: 244
|
||||||
| 19.07.2013, 08:16 | ||||||
|
использовать сериализацию, для этого пометить класс атрибутом
1
|
||||||
|
14 / 18 / 5
Регистрация: 13.04.2011
Сообщений: 148
|
||||||||||||
| 19.07.2013, 09:24 [ТС] | ||||||||||||
|
Есть вариант сделать не класс, а структуру и явно указать размер выделяемой памяти. Вот так:
Во избежание лишних вопросов, не я придумал такой пакет. Мне просто нужно следовать установленному формату. Добавлено через 6 минут у меня пакет данных должен быть размером в 97 байт. Добавлено через 20 минут Проблема решилась вот так:
Добавлено через 11 минут Есть мысль что можно каждое поле по отдельности конвертировать с помощью BitConverter.GetBytes, а потом собрать все результаты в один байтовый массив как-будто класс полностью преобразовали. Но это в теории, как это реализовать я что-то даже не представляю. Может кто знает как сделать это или проще способ?
0
|
||||||||||||
|
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,279
|
|
| 19.07.2013, 09:33 | |
|
natrox,
Здесь была похожая тема как сохранить в массиве байт разнотипную информацию, а потом извлечь ее
1
|
|
|
14 / 18 / 5
Регистрация: 13.04.2011
Сообщений: 148
|
||||||||||||
| 19.07.2013, 11:45 [ТС] | ||||||||||||
![]() Структура:
Добавлено через 40 минут BitConverter.GetBytes возвращает 16 битовое значение. Поэтому получается не 1, а 2 байта на выходе. А мне надо чтобы остался 1 байт как в структуре.
0
|
||||||||||||
|
8 / 8 / 2
Регистрация: 07.02.2012
Сообщений: 71
|
||
| 19.07.2013, 13:31 | ||
|
0
|
||
|
Master of Orion
|
||||||
| 19.07.2013, 20:14 | ||||||
|
Мб выравнивание?
Добавлено через 2 минуты Попробуйте так:
0
|
||||||
|
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
|
|||||||||||
| 19.07.2013, 21:28 | |||||||||||
|
Сериализация не пройдет. потому что там отправляются метаданные.
Если вы хотите "кидатся чистыми данными" вам надо структуру привести в массив байт. Как это сделать? * есть несколько способов, самым быстрым является связка Marshal + unsafe код.
Рабочий пример:
2
|
|||||||||||
|
14 / 18 / 5
Регистрация: 13.04.2011
Сообщений: 148
|
||
| 20.07.2013, 08:09 [ТС] | ||
|
Добавлено через 3 минуты Konctantin, огромное спасибо за совет. Попробую сделать так как вы посоветовали. Думаю мне это подойдет.
0
|
||
|
14 / 18 / 5
Регистрация: 13.04.2011
Сообщений: 148
|
|||||||||||
| 22.07.2013, 09:32 [ТС] | |||||||||||
|
Konctantin, попытался применить ваш метод и получил ошибку:
"Тип указанного массива не совпадает с ожидаемым." на вот эту строку
Добавлено через 17 часов 51 минуту А с помощью BinaryWriter есть вариант это сделать? Даже если каждое поле в отдельности записывать в массив байт придется, мне такое тоже подойдет. Уже любой вариант подойдет, лишь бы работало ![]() Добавлено через 58 секунд Если кто может дать пример преобразования моей структуры в массив байт в ручную, буду очень благодарен Добавлено через 4 часа 0 минут Ситуация следующая: Ошибка была по той причине что у меня в структуре поле логин помечено размером в 64 байта, а на деле я в него записываю 8 байт. Проблема в том что поле должно быть 64 байта, сервер ждет именно такой размер. Но допустим логин на 8 символов, да и вообще не известно какой там логин будет у пользователя, 64 байта это размер с запасом на любой логин Что можно сделать в таком случае? Код структуры на данный момент:
0
|
|||||||||||
|
Master of Orion
|
|||||||||||
| 22.07.2013, 11:19 | |||||||||||
1
|
|||||||||||
|
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
|
||||||
| 22.07.2013, 11:24 | ||||||
|
1) не заморачивайтесь с оффсетами, они тут вам не нужны, достаточно 1 атритута
Но так как это не практично, то вам надо сделать свой обработчик и построитель пакетов.
2
|
||||||
| 22.07.2013, 11:29 | |
|
Не по теме: Konctantin, чет я тоже про свойство подумал :)
0
|
|
|
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
|
|
| 22.07.2013, 11:51 | |
|
вобще-то забивать массив нулями не есть хорошо, это же лишний размер.
Я бы поступил так: Создавал бы структуру, в начале писал бы нативные типы, а в конец засунул бы строки. Далее, ограничивал бы структуру размером нативных типов, а строки дописывал бы в конец пакета. В место строк указал бы их смещения в пакете. при разборе обратно, получили нативные типы, а потом прочитал бы строки из оставшегося куска. В реализации немного сложнее, но суть остается та же. Вот только при реализации "сложных" пакетов такой фокус не получится.
1
|
|
|
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
|
||||||
| 22.07.2013, 12:28 | ||||||
1
|
||||||
|
14 / 18 / 5
Регистрация: 13.04.2011
Сообщений: 148
|
||||||
| 23.07.2013, 04:55 [ТС] | ||||||
|
Проблема решилась благодаря добавлению пустых значений в конец строки.
0
|
||||||
| 23.07.2013, 04:55 | |
|
Помогаю со студенческими работами здесь
16
Дан массив из 10 байт. Посчитать количество байт, в которых сброшены 6 и 4 биты Дан массив из 6 байт. Посчитать количество байт число единиц, в которых не превышает 3. Дан массив из 10 байт. Посчитать количество байт содержащих ровно три единицы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|