C#:将 ushort 转换为浮点数

本文关键字:浮点数 转换 ushort | 更新日期: 2023-09-27 18:22:39

从我正在使用的库中,我收到了一个ushort数组。

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

我尝试了如下方法,但该值被转换为整数的值,而不是原始位:

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

有什么建议吗?

C#:将 ushort 转换为浮点数

看看 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顺序。现在是正确的

你应该使用 BitConverter 类。

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

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

使用 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;
}

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

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

我知道

这个线程超级旧,但我有一个类似的问题,上面没有解决。我必须使用 modbus 向 plc 发送一个十进制值,而我写入寄存器的唯一选择是 ushort 数组。幸运的是,plc上的软件可以将ushort数组转换回小数,问题是从plc读取数据。这是我能够开始工作的原因。ConvertTo 接受用户输入并为写入创建 ushort 数组,ConvertFrom 获取程序从 plc 接收的 ushort 数组并将其转换回浮点数。

    private ushort[] ConvertTo(string value)
    {
        var bytes = BitConverter.GetBytes(float.Parse(value));
        return new ushort[] {
            BitConverter.ToUInt16(bytes, 0),
            BitConverter.ToUInt16(bytes, 2)
        };
    }
    private float ConvertFrom(ushort valueOne, ushort valueTwo)
    {
        byte[][] final = Array.ConvertAll(new ushort[] { valueOne, valueTwo }, delegate (ushort item) { return BitConverter.GetBytes(item); });
        return BitConverter.ToSingle(new byte[4] { final[0][0], final[0][1], final[1][0], final[1][1] }, 0);
    }