Как конвертировать гекс в плавающее с помощью C#
Я получаю данные из ST MCU через UART и отображаю значение на экране ПК, но его результат отличается от того, что я ожидал в типе float.
Я использую TrueStudio для ST MCU и C# для отображения значений на экране. Я использую значение с плавающей точкой в MCU и отправляю данные на ПК. Когда я попадаю на ПК, если я отображаю значение с плавающей точкой в textBox, его результат слишком отличается, как я ожидал. В представлении памяти TrueStudio и просмотре часов, я могу видеть ниже
В TrueStudio MCU я вижу
- в окне просмотра: acc.x = 5.12400007
- в памяти: 5.124000E0 в формате с плавающей запятой CFF7A340 в шестнадцатеричном формате
Я мог бы получить эти данные в ПК через 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(ðBuf[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
,