-2

float のリトルエンディアンをビッグエンディアンに変換し、UDP 経由で送信する必要があります。切り取られたコードは、coord データを受け取り、それを float 配列に割り当て、次に byte データ配列に変換し、最終的に UDP 接続を介して送信する必要がありますが、機能しません!

public void SendUDP()
    {
        try 
        {
            lockObj.EnterReadLock();
            try
            {   
                foreach(CoordData datam in coordDataList)
                {
                    float[] dfv = {datam.X, datam.Y, datam.Z, datam.Alpha, datam.Theta, datam.Phi};

                    /*
                    data = BitConverter.GetBytes(datam.Y);
                    data = BitConverter.GetBytes(datam.Z);
                    data = BitConverter.GetBytes(datam.Alpha);
                    data = BitConverter.GetBytes(datam.Theta);
                    data = BitConverter.GetBytes(datam.Phi);
                */
                data = BitConverter.GetBytes(dfv);  
                Array.Reverse(data);    

                }
                client.Send(data, data.Length, remoteEndPoint); 

            }
                finally
                {
                lockObj.ExitReadLock();

                }

                }

        catch (Exception err)
        {
            print(err.ToString());
        }
    }
4

3 に答える 3

1

あなたの問題は、フロートの配列全体を逆にしていることです。個々のフロートのバイトを逆にする必要があります。

BitConverter.GetBytes実際、配列を取るオーバーロードがないため、質問に書いたものはコンパイルさえしません。

あなたがしなければならないこと(これを処理するために存在するライブラリ関数を使用する以外)は、次のようなものです:

List<byte> myData = new List<byte>();

myData.AddRange(Array.Reverse(BitConverter.GetBytes(datam.x));
myData.AddRange(Array.Reverse(BitConverter.GetBytes(datam.y));
//....etc....

byte[] bytesToSend = myData.ToArray();
于 2012-11-27T15:46:46.513 に答える
1

IPAddress.HostToNetworkOrder()を使用して、値が環境に適していることを確認する必要があります。

于 2012-11-27T16:07:06.183 に答える
0

問題の解決策は次のとおりです。

    int width = sizeof(float);

    int nDataIndex = 0;
    byte[] data = new byte[myData.Count * width];

        for (int i = 0; i < myData.Count; ++i)
        {
            byte[] converted = BitConverter.GetBytes(myData[i]);

            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(converted);
            }

            for (int j = 0; j < width; ++j)
            { 

                data[nDataIndex+j] = converted[j];          
            }
            nDataIndex+=width;
        }

        client.Send(data, data.Length, remoteEndPoint);
于 2012-12-12T12:23:39.323 に答える