所以我得到了一個可變數量的座標(經度和緯度)。我想以簡單直接的方式打包這些座標,可以通過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」不能被編組爲不接受管理結構;無法計算出有意義的大小或偏移量。
謝謝這很有用。可以指定endianness嗎? – Shatnerz
這是你正在運行的架構的一個特點......一些處理器是小端的,有些是大端的。當序列化傳輸時使用'IPAddress.HostToNetworkOrder()',反序列化時'IPAddress.NetworkToHostOrder()'可以安全地播放它。 –