Маршалинг структур: динамическое управление размером - C#
Формулировка задачи:
Решил изучить как с помощью средств c# передавать структуры. Нашел способы преобразования структур в массив байт с помощью Marashal. Вот код структуры:
Собственно вопрос. Так как мне приходится над переменными типа массив указывать их размер, чтобы можно было преобразовать к массиву байт структуру, то получается у меня структура всегда одного и того же размера. Допустим мне надо передать структуру, в которой я только заполню поле pack_type, следовательно все остальное будет пустым, но так как размеры массивов уже предопределены, я отправлю структуру, как бы полностью забитую, а это не очень выгодно, в плане передачи по сети, чем меньше размер пакета, тем лучше. Можно ли строки типа "[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]" задавать динамически, во время формирования данных для структуры?
[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;
}Решение задачи: «Маршалинг структур: динамическое управление размером»
textual
Листинг программы
pack.packet_version = (short)IPAddress.NetworkToHostOrder(reader.ReadInt16());