将十六进制转换为浮点32
本文关键字:十六进制 转换 | 更新日期: 2023-09-27 18:03:14
我有一个十六进制的(42 E6 56 00)
,应该转换成这个浮点数:115.2
,当然它是浮点32
(我用计算器得到了115.2
)。现在我想用c#执行这个操作,我使用下面的代码,但它给了我奇怪的值:
byte[] bytes = BitConverter.GetBytes(0x42E65600);
if (BitConverter.IsLittleEndian) {
bytes = bytes.Reverse().ToArray();
}
float myFloat = BitConverter.ToSingle(bytes, 0);
更好的写法:
byte[] bytes = new byte[]{ 0x42, 0xE6, 0x56, 0x00 }; // Big endian data
if (BitConverter.IsLittleEndian) {
Array.Reverse(bytes); // Convert big endian to little endian
}
float myFloat = BitConverter.ToSingle(bytes, 0);
注意BitConverter
使用平台的端序。
我测试了一个IEEE-754分析,似乎你的源数据是真的大端,所以这是正确的方式来写。
你可能不知道,BitConverter.GetBytes(0x42E65600);
会在小端平台上得到byte[]{ 0x00, 0x56, 0xE6, 0x42 }
。
如果你坚持写十六进制文字,你不需要转换结尾(因为它总是正确的,见@George的评论)
byte[] bytes = BitConverter.GetBytes(0x42E65600);
float myFloat = BitConverter.ToSingle(bytes, 0); // Always be correct
我有一个十六进制(42 E6 5600),应该翻译成这个浮点数:115.2
如果是这种情况,那么你的数据是大端字节格式
BitConverter.IsLittleEndian
这将决定你的位转换比特数,所以你会希望条件为
if (!BitConverter.IsLittleEndian)
最后,你的端序转换是错误的。您不希望反转整个数组,而是交换单个float项
for (int i = 0; i < data.Length / 2; i++)
{
Swap<byte>(ref data[i], ref data[data.Length - i - 1]);
}
结合所有这些校正,你的代码应该看起来像
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
static byte[] Big2Little(byte[] data)
{
for (int i = 0; i < data.Length / 2; i++)
{
Swap<byte>(ref data[i], ref data[data.Length - i - 1]);
}
return data;
}
static void Main(string[] args)
{
byte[] bytes = BitConverter.GetBytes(0x42E65600);
if (!BitConverter.IsLittleEndian)
{
bytes = Big2Little(bytes);
}
float myFloat = BitConverter.ToSingle(bytes, 0);
System.Console.Out.WriteLine(myFloat);
}
注释您可以从IEEE Analyzer