Как конвертировать гекс в плавающее с помощью C#

Я получаю данные из ST MCU через UART и отображаю значение на экране ПК, но его результат отличается от того, что я ожидал в типе float.

Я использую TrueStudio для ST MCU и C# для отображения значений на экране. Я использую значение с плавающей точкой в ​​MCU и отправляю данные на ПК. Когда я попадаю на ПК, если я отображаю значение с плавающей точкой в ​​textBox, его результат слишком отличается, как я ожидал. В представлении памяти TrueStudio и просмотре часов, я могу видеть ниже

  1. В TrueStudio MCU я вижу

    • в окне просмотра: acc.x = 5.12400007
    • в памяти: 5.124000E0 в формате с плавающей запятой CFF7A340 в шестнадцатеричном формате
  2. Я мог бы получить эти данные в ПК через Visual Studio в C#

    • Я могу видеть данные массива byte[] через окно просмотра, и я вижу, что получил

      msg[4] = 0xCF, msg[5] = 0xF7, msg[6] = 0xA3, msg[7] = 0x40
      
    • так в декабре 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); 
    

    В визуальной студии C#

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

    Сначала я попробовал MSB/LSB и не смог получить то, что хотел. Как я могу получить 5.123 плавающее значение в C#?

1 ответ

Решение

Вы можете конвертировать в гекс, используя BitConverter.GetBytes а также 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);
}

Попробуйте онлайн

В зависимости от системы, с которой вы хотите обмениваться данными, вам, возможно, придется учитывать порядок байтов и соответственно изменять порядок байтов. Вы можете проверить на порядковый номер, используя BitConverter.IsLittleEndian,

Другие вопросы по тегам