Итак, я получаю переменное количество координат (широта и долгота). Я хочу скопировать эти координаты прямым способом, который можно легко отправить через UDP и распаковать. Как я могу это сделать с помощью C#?Упаковка udp-пакета произвольного числа координат
Я предполагаю, что объявляю struct
, а затем использую встроенную сортировку для получения массива байтов для отправки. Как это можно сделать, когда имеется переменное количество очков?
Большая часть моего опыта программирования была в Python, но мне нужно, чтобы это было сделано на C#, с которым у меня ограниченный опыт.
Редактировать: Я добавлю код, который я тестировал, так как я чувствую, что никто не реагирует только на текст.
namespace ConsoleApplication1
{
class Testing
{
static void Main(string[] args)
{
// Console.WriteLine("Starting");
// string text = "Hello";
// byte[] data = Encoding.ASCII.GetBytes(text);
StartPacket test = new StartPacket();
test.len = 3;
List<double> points = new List<double>();
points.Add(3.14);
points.Add(5);
points.Add(-1023.1231311);
test.points = points;
byte[] data = StructureToByteArray(test);
SendUdp(65456, "192.168.20.100", data);
}
static void SendUdp(int srcPort, string dstIp, byte[] data)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
IPAddress dst = IPAddress.Parse(dstIp);
IPEndPoint endPoint = new IPEndPoint(dst, srcPort);
sock.SendTo(data, endPoint);
}
public struct StartPacket
{
public uint len;
public List<double> points;
}
public static byte[] StructureToByteArray(object obj)
{
int len = Marshal.SizeOf(obj);
byte[] arr = new byte[len];
IntPtr ptr = Marshal.AllocHGlobal(len);
Marshal.StructureToPtr(obj, ptr, true);
Marshal.Copy(ptr, arr, 0, len);
Marshal.FreeHGlobal(ptr);
return arr;
}
}
}
Этот код выдает: Типа «ConsoleApplication1.Testing + StartPacket» не может быть маршалингом как неуправляемые структуры; никакие значимые размеры или смещение не могут быть вычислены.
Спасибо, что это полезно. Можно ли указать спецификацию? – Shatnerz
Это характерная черта архитектуры, на которой вы работаете ... некоторые процессоры малоконтинентальные, некоторые из них имеют большой размер. Вы можете безопасно играть с помощью 'IPAddress.HostToNetworkOrder()' при сериализации для транспорта и 'IPAddress.NetworkToHostOrder()' при десериализации. –