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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать (преобразовать) struct в socket? 
:(
    Опции темы
Viceroy
Дата 24.3.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть структура:
Код

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct DataBlock
        {
            public UInt32 data0;
            public UInt32 data1;
            public UInt32 data2;
            public UInt32 data3;
        }
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct Packet
        {
            public UInt32 SOP;
            public UInt16 PacketSize;
            public UInt16 ProtocolVersion;
            public UInt16 Code;
            public UInt16 SubCode;
            public UInt16 Reserve0;
            public UInt16 Reserve1;
            public UInt16 numblocks;
            public DataBlock[] Data;  
            public UInt32 EOP;   
        };

Как ее передать/принять в socket? Передача доп. информации исключена (Serialize не годится).
PM MAIL   Вверх
-Mikle-
Дата 24.3.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата(Viceroy @  24.3.2009,  20:08 Найти цитируемый пост)
Serialize не годится

ну тогда ручками
            BitConverter.ToUInt32(buff, 0);



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
v00d00
Дата 25.3.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

        public static byte [] StructToByteArray<T>(T _struct)
        {
            byte[] data = new byte[Marshal.SizeOf(typeof(T))];
            IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)));
            Marshal.StructureToPtr(_struct, pointer, false);
            Marshal.Copy(pointer,data, 0, Marshal.SizeOf(typeof(T)));
            Marshal.FreeHGlobal(pointer);
            return data;
        }


Важно правильно описать передаваемую структуру. Массивы байт определяются как в примере ниже

Код

[StructLayout(LayoutKind.Sequential,Pack = 1,Size=128)]
public struct PCXHeader
{
       public byte Manufacturer;        // Постоянный флаг 10 = ZSoft .PCX
       public byte Version;             // 0 = Версия 2.5
                                        // 2 = Версия 2.8 с информацией о палитре
                                        // 3 = Версия 2.8 без информации о палитре
                                        // 5 = Версия 3.0
       public byte Encoding;            // 1 = .PCX кодирование длинными сериями
       public byte BitsPerLayer;        // Число бит на пиксел в слое
       public uint Xmin;                // Размеры изображения
       public uint Ymin;                // Размеры изображения
       public uint Xmax;                // Размеры изображения
       public uint Ymax;                // Размеры изображения
       public uint HRes;                // Горизонтальное разрешение создающего устройства
       public uint VRes;                // Вертикальное разрешение создающего устройства
       [MarshalAs(UnmanagedType.ByValArray,SizeConst = 48)] 
       public byte[] Colormap;      // Набор цветовой палитры (см. далее текст)
       public byte Reserved;
       public byte NPlanes;             // Число цветовых слоев
       public uint BPL;                 // Число байт на строку в цветовом слое
                                        // (для PCX-файлов всегда должно быть четным)
       public uint Palette;             // Как интерпретировать палитру:
                                        // 1 = цветная/черно-белая,
                                        // 2 = градации серого
       [MarshalAs(UnmanagedType.ByValArray, SizeConst = 58)] 
       public byte[] Filler;        // Заполняется нулями до конца заголовка
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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