Маршалинг структур: динамическое управление размером - C#

Узнай цену своей работы

Формулировка задачи:

Решил изучить как с помощью средств c# передавать структуры. Нашел способы преобразования структур в массив байт с помощью Marashal. Вот код структуры:
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
        public struct Package
        {
            public byte pack_type;
            public byte con_status;
            public uint user_id;
            public byte user_status;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string user_name;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string dest_user;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
            public byte[] buffer;
        }
Собственно вопрос. Так как мне приходится над переменными типа массив указывать их размер, чтобы можно было преобразовать к массиву байт структуру, то получается у меня структура всегда одного и того же размера. Допустим мне надо передать структуру, в которой я только заполню поле pack_type, следовательно все остальное будет пустым, но так как размеры массивов уже предопределены, я отправлю структуру, как бы полностью забитую, а это не очень выгодно, в плане передачи по сети, чем меньше размер пакета, тем лучше. Можно ли строки типа "[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]" задавать динамически, во время формирования данных для структуры?

Решение задачи: «Маршалинг структур: динамическое управление размером»

textual
Листинг программы
pack.packet_version = (short)IPAddress.NetworkToHostOrder(reader.ReadInt16());

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы