У меня есть система, в которой удаленный агент отправляет сериализованные структуры (из встроенной системы C) для чтения и хранения через IP/UDP. В некоторых случаях мне нужно отправить те же типы структуры. Я думал, что у меня хорошая настройка с использованием Marshal.PtrToStructure(получение) и Marshal.StructureToPtr(отправка). Тем не менее, небольшая ошибка заключается в том, что сетевые большие конечные числа необходимо преобразовать в маленький xini-формат 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, но я не очень хорошо знаком с этой функцией. Кроме того, я надеялся, что там будет лучшее решение, что кто-то может указать мне. Спасибо заранее:)