У меня есть система, в которой удаленный агент отправляет сериализованные структуры (из встроенной системы C) для чтения и хранения через IP / UDP. В некоторых случаях мне нужно отправить обратно те же типы структур. Я думал, что у меня была хорошая установка с использованием Marshal.PtrToStructure (receive) и Marshal.StructureToPtr (send). Однако небольшая проблема заключается в том, что целые числа с прямым порядком байтов в сети должны быть преобразованы в мой формат с прямым порядком байтов x86 для локального использования. Когда я отправляю их снова, путь с прямым порядком байтов - это путь.
Вот функции, о которых идет речь:
private static T BytesToStruct<T>(ref byte[] rawData) where T: struct
{
T result = default(T);
GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
try
{
IntPtr rawDataPtr = handle.AddrOfPinnedObject();
result = (T)Marshal.PtrToStructure(rawDataPtr, typeof(T));
}
finally
{
handle.Free();
}
return result;
}
private static byte[] StructToBytes<T>(T data) where T: struct
{
byte[] rawData = new byte[Marshal.SizeOf(data)];
GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
try
{
IntPtr rawDataPtr = handle.AddrOfPinnedObject();
Marshal.StructureToPtr(data, rawDataPtr, false);
}
finally
{
handle.Free();
}
return rawData;
}
И краткий пример структуры, которая может использоваться следующим образом:
byte[] data = this.sock.Receive(ref this.ipep);
Request request = BytesToStruct<Request>(ref data);
Где рассматриваемая структура выглядит так:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
private struct Request
{
public byte type;
public short sequence;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public byte[] address;
}
Каким (общим) способом я могу поменять порядковый номер при сортировке структур? Моя потребность в том, чтобы локально сохраненный «request.sequence» в этом примере должен был иметь порядок байтов для отображения пользователю. Я не хочу менять порядковый номер в структуре, поскольку это общая проблема.
Моей первой мыслью было использовать Reflection, но я не очень знаком с этой функцией. Кроме того, я надеялся, что найдется лучшее решение, на которое кто-то может указать мне. Заранее спасибо:)