【问题标题】:How to convert little endian to big and send it over UDP?如何将小端转换为大端并通过 UDP 发送?
【发布时间】:2012-11-27 15:41:13
【问题描述】:

我需要将浮动的小端转换为大端并通过 UDP 发送它们。截断的代码接收坐标数据并将其分配给浮点数组,然后转换为字节数据数组,最后应该通过 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());
        }
    }

【问题讨论】:

  • here的答案有什么问题?
  • 有一个内置函数可以做到这一点......我会用那个。
  • @L.B,没有字节序
  • @TimTaker 因为如果你使用一些序列化程序,它会为你处理所有这些东西。
  • @L.B,但是我的终点是 Udp 口袋发送无法反序列化我的序列化,是否可以使用无法反序列化的序列化程序?

标签: c# arrays byte endianness


【解决方案1】:

您的问题是您正在反转整个浮点数组。您需要反转每个 individual float 的字节数。

事实上,您在问题中写的内容甚至不会编译,因为没有采用数组的 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();

【讨论】:

  • 这样我遇到了一个错误:'System.BitConverter.GetBytes(bool)' 的最佳重载方法匹配有一些无效参数
  • @TimTaker:作为 L.B.上面已经说过,库中有一些方法可以为您解决所有这些问题。但是要使您的解决方案有效,您必须遍历每个单独的值GetBytes,反转该字节数组,然后将其添加到您打算发送的最终数组中。如您所见,这有点痛苦。这就是为什么有图书馆可以为您做这件事的原因。
【解决方案2】:

您应该使用IPAddress.HostToNetworkOrder() 来确保您的值适合您的环境。

【讨论】:

    【解决方案3】:

    这里有一个解决问题的方法:

        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);
    

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 2013-10-17
      • 2018-10-19
      • 2021-03-24
      • 2010-10-25
      • 2019-12-03
      相关资源
      最近更新 更多