2012-02-03 127 views
6

從我正在使用的庫中,我收到了一個數組ushortC#:將ushort轉換爲浮點數

我想將它們轉換爲float陣列:第一ushort表示第一float和第二ushort的16 MSB LSB是的第一float 16,依此類推。

我試着用類似於以下,但價值被鑄造爲整數的值,而不是原始位:

ushort[] buffer = { 0xBF80, 0x0000 }; 
float f = (uint)buffer[0] << 16 | buffer[1]; 
// expected result => f == -1   (0xBF800000) 
// effective result => f == 3.21283686E+9 (0x4F3F8000) 

什麼建議嗎?

回答

9

看看System.BitConverter這個課。

特別是,ToSingle方法採用一系列字節並將它們轉換爲浮點數。

ushort[] buffer = {0xBF80, 0x0000}; 
byte[] bytes = new byte[4]; 
bytes[0] = (byte)(buffer[1] & 0xFF); 
bytes[1] = (byte)(buffer[1] >> 8); 
bytes[2] = (byte)(buffer[0] & 0xFF); 
bytes[3] = (byte)(buffer[0] >> 8); 
float value = BitConverter.ToSingle(bytes, 0); 

編輯
在這個例子中,我已經扭轉了MSB/LSB順序。現在它是正確的

1

使用C#工會:

[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]  
public struct FloatUShortUnion { 
    [System.Runtime.InteropServices.FieldOffset(0)] 
    float floatValue; 

    [System.Runtime.InteropServices.FieldOffset(0)] 
    ushort short1; 

    [System.Runtime.InteropServices.FieldOffset(16)] 
    ushort short2; 
} 
+0

固定大小數組的C#語法是'fixed ushort buffer [2];',我不確定它是否與'[FieldOffset]'結合使用。 您不能使用普通的C#數組,因爲它會將指針轉換爲數組,而不是數組內容。 – Daniel 2012-02-03 14:56:05

+0

@Daniel謝謝,我最近沒有用C#編寫程序。 – 2012-02-03 15:42:44

1

我看System.BitConverter類。您可以使用BitConverter.GetBytes將您的ushorts轉換爲字節數組,然後組合您的字節數組並使用BitConverter將字節數組轉換爲float。