2012-10-24 35 views
2

是否可以將浮點數從大端轉換爲小端?我從我通過UDP發送到Windows進程(little endian)的大端平臺獲得了一個值。這個值是一個浮點數,但是當我嘗試BitConverter.ToSingle時,我總是得到5.832204E-42,但它應該是36.000。使用C將大端的浮點數轉換爲小端#

我在做什麼錯?

這裏是剪斷一個代碼:

// Receive thread 
private void ReceiveData() 
{ 
    int count = 0; 

    IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("10.0.2.213"), port); 
    client = new UdpClient(remoteIP); 
    while (true) 
    { 
     try 
     { 
      IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0); 
      byte[] data = client.Receive(ref anyIP); 

      float x = BitConverter.ToSingle(data, 0); 
      float y = BitConverter.ToSingle(data, 4); 
      float z = BitConverter.ToSingle(data, 8); 
      float alpha = BitConverter.ToSingle (data, 12); 
      float theta = BitConverter.ToSingle (data, 16); 
      float phi = BitConverter.ToSingle (data, 20); 

      print(">> " + x.ToString() + ", "+ y.ToString() + ", "+ z.ToString() + ", " + 
        alpha.ToString() + ", "+ theta.ToString() + ", "+ phi.ToString()); 

      // Latest UDP packet 
      lastReceivedUDPPacket=x.ToString()+" Packet#: "+count.ToString(); 
      count = count+1; 
     } 
+2

你嘗試只是扭轉了陣列的第一? –

+0

是的,其顯示只有0 :( – Termin

+0

請告訴我們的數據。 –

回答

5

36.0和5.832204E-42是尾數對立的,所以這是一個字節序的問題。在Windows/.NET上,你通常是小端的,所以我猜數據是高端的。這意味着您需要爲每個值反轉數據,分別爲(不是整個陣列)。要以CPU安全的方式編寫此代碼,最好的方法是檢查BitConverter.IsLittleEndian,並在必要時進行補償。例如:

public static float ReadSingleBigEndian(byte[] data, int offset) 
{ 
    return ReadSingle(data, offset, false); 
} 
public static float ReadSingleLittleEndian(byte[] data, int offset) 
{ 
    return ReadSingle(data, offset, true); 
} 
private static float ReadSingle(byte[] data, int offset, bool littleEndian) 
{ 
    if (BitConverter.IsLittleEndian != littleEndian) 
    { // other-endian; reverse this portion of the data (4 bytes) 
     byte tmp = data[offset]; 
     data[offset] = data[offset + 3]; 
     data[offset + 3] = tmp; 
     tmp = data[offset + 1]; 
     data[offset + 1] = data[offset + 2]; 
     data[offset + 2] = tmp; 
    } 
    return BitConverter.ToSingle(data, offset); 
} 

有:

float x= ReadSingleBigEndian(data, 0); 
float y= ReadSingleBigEndian(data, 4); 
float z= ReadSingleBigEndian(data, 8); 
float alpha= ReadSingleBigEndian(data, 12); 
float theta= ReadSingleBigEndian(data, 16); 
float phi= ReadSingleBigEndian(data, 20); 
+2

爲什麼不'Array.Reverse(data,offset,4)'? – phoog

+0

@phoog可以工作,但是在一路上做了很多額外的檢查等等(畢竟ch ecks,我預計它將由'extern'方法,'TrySZReverse'處理)。但是,是的,那會起作用。 –

+0

現在按需要工作,謝謝Marc! – Termin