如何使用 C# 将十六进制转换为浮点数
How to convert hex to float using C#
我通过 UART 从 ST MCU 获取数据并将值显示到 PC 屏幕,但其结果与我预期的 float 类型不同。
我正在使用 TrueStudio for ST MCU 和 C# 在屏幕上显示值。
我在 MCU 上使用浮点值并将数据发送到 PC
当我进入 PC 时,如果我将 float 值显示到 textBox,它的结果与我的预期相差太大。
在 TrueStudio 内存视图和手表视图中,我可以看到下面
在TrueStudio MCU中,我可以看到
- 在手表 window 中:acc.x = 5.12400007
- 在内存视图中:浮点格式的 5.124000E0
十六进制格式的 CFF7A340
我可以通过 C#visual studio 在 PC 中获取此数据
我可以通过 watch window 看到 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,因此
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);
在visual studio、C#
UInt32 u32 = (UInt32)( msg[4] | (msg[5] << 8) | (msg[6] << 16) | (msg[7]<<24));
LOG("u32 : " + u32 + "\n");
我先用 MSB/LSB 试过,但没能得到我想要的。
如何在 C# 中获取 5.123 浮点值?
您可以使用 BitConverter.GetBytes
and 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
.
检查字节顺序
我通过 UART 从 ST MCU 获取数据并将值显示到 PC 屏幕,但其结果与我预期的 float 类型不同。
我正在使用 TrueStudio for ST MCU 和 C# 在屏幕上显示值。 我在 MCU 上使用浮点值并将数据发送到 PC 当我进入 PC 时,如果我将 float 值显示到 textBox,它的结果与我的预期相差太大。 在 TrueStudio 内存视图和手表视图中,我可以看到下面
在TrueStudio MCU中,我可以看到
- 在手表 window 中:acc.x = 5.12400007
- 在内存视图中:浮点格式的 5.124000E0 十六进制格式的 CFF7A340
我可以通过 C#visual studio 在 PC 中获取此数据
我可以通过 watch window 看到 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,因此
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);
在visual studio、C#
UInt32 u32 = (UInt32)( msg[4] | (msg[5] << 8) | (msg[6] << 16) | (msg[7]<<24)); LOG("u32 : " + u32 + "\n");
我先用 MSB/LSB 试过,但没能得到我想要的。 如何在 C# 中获取 5.123 浮点值?
您可以使用 BitConverter.GetBytes
and 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
.