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

时间:2019-05-30 01:15:18

标签: c# ieee-754 truestudio

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

我将TrueStudio用于ST MCU和C#在屏幕上显示值。 我在MCU上使用浮点值并将数据发送到PC 当我进入PC时,如果我向textBox显示浮点值,则其结果与我预期的太不同了。 在TrueStudio内存视图和观看视图中,我可以在下面看到

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

    • 在监视窗口中:acc.x = 5.12400007
    • 在内存视图中:5.124000E0以浮点格式                 十六进制格式的CFF7A340
  2. 我可以通过C#中的Visual Studio在PC中获取此数据

    • 我可以通过观察窗口看到byte []数组数据,并且可以看到我得到的

      private void makeItemRightClickListener()
      {
          grid.addCellPreviewHandler(new CellPreviewEvent.Handler<T>() {
              @Override
              public void onCellPreview(CellPreviewEvent<T> event)
              {
                  if (event.getNativeEvent().getButton() !=
                              NativeEvent.BUTTON_RIGHT)
                      return;
      
                  // Prevent browser's own context menu from appearing
                  event.getNativeEvent().preventDefault();
                  event.getNativeEvent().stopPropagation();
      
                  handleItemRightClickEvent(event);
              }
          });
      }
      
      private void handleItemRightClickEvent(CellPreviewEvent<T> event)
      {
          NativeEvent nativeClickEvent = event.getNativeEvent();
          // Get the data (type T) that is being displayed in the cell
          // by the CellTable or DataGrid widget.
          T rowClicked = event.getValue();
      
          // Create PopupPanel for menu
          PopupPanel popup = ...
      
          // Show the popup menu at the click position
          UIObject target = new MousePointUIObject(nativelickEvent);
          popup.showRelativeTo(target);
      }
      
      private static class MousePointUIObject extends UIObject
      {
          private NativeEvent mouseEvent;
      
          public MousePointUIObject(NativeEvent mouseEvent)
          {
              this.mouseEvent = mouseEvent;
          }
      
          @Override
          public int getAbsoluteLeft()
          {
              return mouseEvent.getClientX() + Window.getScrollLeft();
          }
      
          @Override
          public int getAbsoluteTop()
          {
              return mouseEvent.getClientY() + Window.getScrollTop();
          }
      
          @Override
          public int getOffsetWidth()
          {
              return 0;
          }
      
          @Override
          public int getOffsetHeight()
          {
              return 0;
          }
      }
      
    • 所以在12月3489112896
    • 我用这些值转换了此值,但我无法获得想要的5.124

      msg[4] = 0xCF, msg[5] = 0xF7, msg[6] = 0xA3, msg[7] = 0x40
      

      将dec转换为UInt32

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

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

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

    在Visual Studio中,C#

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

    我先尝试过MSB / LSB,但无法获得想要的东西。 如何在C#中获得5.123浮动值?

1 个答案:

答案 0 :(得分:1)

您可以使用BitConverter.GetBytesBitConverter.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检查字节序。