C#:将ushort转换为float

时间:2012-02-03 14:49:03

标签: c# .net casting

在我正在使用的库中,我收到了一组ushort

我希望将它们转换为float数组:第一个ushort代表第一个float的16个MSB,第二个ushort是16个LSB第一个float,依此类推。

我尝试使用类似下面的内容,但是值被转换为整数的值,而不是原始位:

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

有什么建议吗?

5 个答案:

答案 0 :(得分:10)

查看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 :(得分:2)

您应该使用BitConverter类。

使用BitConverter.GetBytes(UInt16)将两个ushorts转换为字节数组,连接两个数组并使用BitConverter.ToSingle(byte[] value,int startIndex)将结果数组中的4个字节转换为float。

答案 2 :(得分:1)

使用C#union:

[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;
}

答案 3 :(得分:1)

我会看一下System.BitConverter类。您可以使用BitConverter.GetBytes将您的ushorts转换为字节数组,然后组合您的字节数组并使用BitConverter将字节数组转换为浮点数。

答案 4 :(得分:0)

您需要使用System.BitConverter,并将短信转换为字节。

http://msdn.microsoft.com/en-us/library/system.bitconverter.tosingle.aspx