如何使用 C# 将十六进制转换为浮点数

How to convert hex to float using C#

我通过 UART 从 ST MCU 获取数据并将值显示到 PC 屏幕,但其结果与我预期的 float 类型不同。

我正在使用 TrueStudio for ST MCU 和 C# 在屏幕上显示值。 我在 MCU 上使用浮点值并将数据发送到 PC 当我进入 PC 时,如果我将 float 值显示到 textBox,它的结果与我的预期相差太大。 在 TrueStudio 内存视图和手表视图中,我可以看到下面

  1. 在TrueStudio MCU中,我可以看到

    • 在手表 window 中:acc.x = 5.12400007
    • 在内存视图中:浮点格式的 5.124000E0 十六进制格式的 CFF7A340
  2. 我可以通过 C#visual studio 在 PC 中获取此数据

    • 我可以通过 watch window 看到 byte[] 数组数据,我可以看到我得到了

      msg[4] = 0xCF, msg[5] = 0xF7, msg[6] = 0xA3, msg[7] = 0x40
      
    • 12 月 3489112896
    • 我用这些转换了这个值,但我得不到我想要的,5.124

      str = "3489112896"
      Convert.ToDouble(str) = 2246812992
      

      已将 dec 转换为 UInt32,因此

      u32 = Convert.ToDouble(str)
      u32 = 0xcff7a340
      (double)u32 = 3489112896
      (float)u32 = 3.48911283E+09
      BitConverter.ToSingle(BitConverter.GetBytes((int)u32), 0) = -2.21599971E-35
      

    在 TrueStudio 中,复制如下(在 C 中)

    memcpy(&ethBuf[len], &g_Bsp.acc, sizeof(ACC_ST));
    len += sizeof(ACC_ST); 
    

    在visual studio、C#

    UInt32 u32 = (UInt32)( msg[4] | (msg[5] << 8) | (msg[6] << 16) | (msg[7]<<24));
    LOG("u32 : " + u32 + "\n");    
    

    我先用 MSB/LSB 试过,但没能得到我想要的。 如何在 C# 中获取 5.123 浮点值?

您可以使用 BitConverter.GetBytes and BitConverter.ToString:

转换为十六进制
public static string FloatToHex(float val)
{
    var bytes = BitConverter.GetBytes(val);
    return BitConverter.ToString(bytes).Replace("-", string.Empty);
}

并且您可以通过将数据转换回 byte 数组,然后使用 BitConverter.ToSingle:

从十六进制 转换回
public static float HexToFloat(string hexVal)
{
    byte[] data = new byte[hexVal.Length / 2];
    for (int i = 0; i < data.Length; ++i)
    {
        data[i] = Convert.ToByte(hexVal.Substring(i * 2, 2), 16);
    }
    return BitConverter.ToSingle(data, 0);
}

Try it online

根据您要与之交换数据的系统,您可能必须考虑字节顺序并相应地反转字节的顺序。您可以使用 BitConverter.IsLittleEndian.

检查字节顺序