![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| zss |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
есть простая структура на C++
я передаю ее через сокет и получаю массив byte[]. мне приходится создавать промежеточную структуру
преобразовывать массив байт к ней
а потом руками заполнять поля S2
тоже и в обратную сторону. Есть ли способ сразу получить из S -> S2 и из S2 -> S ? |
||||||||
|
|||||||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Можно, если заюзать не unsafe а обычную структуру с атрибутом [StructLayout(LayoutKind.Explicit)] и над массивом поставить [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
-------------------- ![]() |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
||||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Вот код, с кое-какими поправками от первого совета
SomeDll.cpp
Program.cs
-------------------- ![]() |
||||
|
|||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
а сразу в string нельзя ? только в byte[]
|
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
кстати есть еще типичная несовместимость типов
например bool в C++ 1 байт, а в C# 4 байта. Можно ли это тоже уровнять ? |
|||
|
||||
| Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
С чего ты взял? bool в C# тоже 1 байт. 100%.
Добавлено @ 11:26 Да и вообще, если увидишь в каком-либо языке программирования, что экземпляр типа true\false, больше 1 байта, можешь сразу бросать этот язык. Думаю, ты понимаешь, почему. -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
It is true. Но храниться в стеке как 4 байта (последние 3 пустые) Добавлено @ 11:37 Naum, бросай C# |
|||
|
||||
| Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
Упс. Так я еще толком и не начинал. -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
||||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Размер bool-поля структуры можно задать тем же самым [MarshalAs(UnmanagedType.I1)]. Также можно поюзать [StructLayout(LayoutKind.Explicit)] в паре с [FieldOffset(смещение_в_байтах)] над полями.
-------------------- ![]() |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
mr.DUDA, а что за I1?
и спасибо за помощь во всех моих темах З.Ы. У меня складывается впечатление, что ты знаещь какую-то волшебную книгу по C# раз столько знаний. Поделись названием Добавлено @ 23:11 З.Ы.Ы. кстати все эти MarshalAs сохраняются только на следующую строку или можно на все структуру сразу задать ? |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
zss, технология и язык достаточно простые, чтобы освоить за полгода. Всё упирается в опыт использования конкретных вещей.
На каждое поле в отдельности. -------------------- ![]() |
|||
|
||||
| zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
странно, то после этих изменений перестал выполняться код
я сделал так
теперь слетает при попытке определить размер int size = Marshal.SizeOf(obj); и говорит, что
З.Ы. Кстати маршалинг также не работает если это не структура, а класс. Почему ? |
||||
|
|||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Строку нельзя маршаллизировать как массив. Для строк есть отдельный тип маршаллизации: ByValTStr. К тому же, не мешало бы указать что структура выровнена по границам 1 байта, а для строк используется charset ANSI (1 байт на символ):
Работает. -------------------- ![]() |
||||
|
|||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |