Вы также можете попробовать код, подобный следующему, если вам действительно нужно передать структуры в виде байтового массива:
int rawsize = Marshal.SizeOf(value);
byte[] rawdata = new byte[rawsize];
GCHandle handle = GCHandle.Alloc(rawdata, GCHandleType.Pinned);
Marshal.StructureToPtr(value, handle.AddrOfPinnedObject(), false);
handle.Free();
Преобразует данный объект значение в необработанные байтовые массивы. Я взял это из кода, который я ранее написал, и вам может понадобиться адаптировать его к вашим потребностям, чтобы он действительно работал. Я использовал его для связи с некоторым оборудованием с пользовательскими структурами, но оно должно работать и для встроенных типов (в конце концов, это структуры, не так ли?)
Чтобы правильно выровнять элементы структуры, используйте атрибут StructLayout для указания однобайтового выравнивания:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
А затем используйте атрибут MarshalAs по мере необходимости для полей, например для встроенных массивов:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
byte[] _state;
Код для получения структуры из байтового массива выглядит примерно так:
public T GetValue<T>()
{
GCHandle handle = GCHandle.Alloc(RawValue, GCHandleType.Pinned);
T structure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),
typeof(T));
handle.Free();
return structure;
}
Конечно, вам нужно знать тип, который вы хотите, чтобы это работало.
Обратите внимание, что это не справится с порядком байтов для себя. В моем проекте большинство полей были только одного байта, поэтому это не имело значения, но для нескольких полей, где это было, я просто сделал поля закрытыми и добавил общедоступные свойства, которые позаботятся о порядке байтов ( Jon Skeet's Ссылка от комментария к его ответу может вам помочь, я написал несколько полезных функций для этого, так как мне нужно было всего несколько).
Когда мне это понадобилось, я создал класс Message, в котором будет храниться необработанное значение (отсюда метод GetValue, код вверху на самом деле является телом метода SetValue), и у меня был удобный метод для получения отформатированного значения и т.д.