背景
首先,我有一些十六进制数据...... 0x3AD3FFD6
。我已选择将此数据表示为字节数组,如下所示:
byte[] numBytes = { 0x3A, 0xD3, 0xFF, 0xD6 };
我尝试通过执行以下代码将此字节数组转换为其单精度浮点值:
float floatNumber = 0;
floatNumber = BitConverter.ToSingle(numBytes, 0);
我使用this IEEE 754 Converter在线计算得到了以下结果:
0.0016174268
我希望C#代码的输出产生相同的东西,但我得到类似的东西......
-1.406E + 14
问题
有人可以解释这里发生了什么吗?
答案 0 :(得分:3)
字节顺序错误。 BitConverter
使用底层系统的端点(计算机体系结构),确保始终使用正确的字节序。
答案 1 :(得分:0)
快速回答:你的numBytes数组中的字节顺序是向后的。
由于您使用C#进行编程,我认为您使用的是英特尔处理器,而英特尔处理器是小端的;也就是说,它们首先存储(并期望)最不重要的字节。在您的numBytes数组中,您首先放置最重要的字节。
BitConverter没有那么多转换字节数组数据,因为它将解释它作为另一种基本数据类型。想想保存字节数组的物理内存:
b0 | b1 | b2 | B3。
要将解释该字节数组作为单精度浮点数,必须知道机器的字节序,即LSByte是先存储还是最后存储。 LSByte可能看起来很自然,因为我们很多人都是这样看的,但对于小端(英特尔)处理器来说,这是不正确的。