したがって、可変数の座標(緯度と経度)を取得しています。私は簡単に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.HostToNetworkOrder()'を使用して安全に再生できます。 –