Как конвертировать гекс в плавающее с помощью C # - PullRequest
0 голосов
/ 30 мая 2019

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

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

  1. В MCU TrueStudio я вижу

    • в окне просмотра: 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); 
    

    В visual studio, 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 Ответ

1 голос
/ 30 мая 2019

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

...