Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C将十六进制转换为浮点#_C#_Ieee 754_Truestudio - Fatal编程技术网

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

C# 如何使用C将十六进制转换为浮点#,c#,ieee-754,truestudio,C#,Ieee 754,Truestudio,我通过UART从ST MCU获取数据,并将值显示到PC屏幕,但其结果与我在浮点型中预期的结果不同 我正在使用TrueTudio for ST MCU和C#在屏幕上显示值。 我在MCU中使用浮点值并将数据发送到PC 当我进入PC机时,若我向文本框显示浮点值,其结果与我预期的结果相差太大。 在TrueStudioMemory视图和watch视图中,我可以看到下面的内容 在TrueStudio MCU中,我可以看到 手表窗口内:acc.x=5.12400007 内存视图:浮点格式的5.124000E

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

我正在使用TrueTudio for ST MCU和C#在屏幕上显示值。 我在MCU中使用浮点值并将数据发送到PC 当我进入PC机时,若我向文本框显示浮点值,其结果与我预期的结果相差太大。 在TrueStudioMemory视图和watch视图中,我可以看到下面的内容

  • 在TrueStudio MCU中,我可以看到

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

    • 我可以通过观察窗口看到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 so

      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中)

    在visual studio中,C#

    UInt32 u32=(UInt32)(msg[4]|(msg[5])您可以使用和转换为十六进制:

    您可以通过将数据转换回
    字节
    数组,然后使用以下方法从十六进制转换回:

    公共静态浮点HexToFloat(字符串hexVal)
    {
    字节[]数据=新字节[hexVal.Length/2];
    对于(int i=0;i

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

    memcpy(&ethBuf[len], &g_Bsp.acc, sizeof(ACC_ST));
    len += sizeof(ACC_ST); 
    
    UInt32 u32 = (UInt32)( msg[4] | (msg[5] << 8) | (msg[6] << 16) | (msg[7]<<24));
    LOG("u32 : " + u32 + "\n");    
    
    public static string FloatToHex(float val)
    {
        var bytes = BitConverter.GetBytes(val);
        return BitConverter.ToString(bytes).Replace("-", string.Empty);
    }
    
    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);
    }