C#中float到Little Endian的转换

float to Little Endian Conversion in C#

我想将一些值转换为小端。我对将 int 转换为 little endian 没有任何问题,如下所示

private string ConverToLittleendian(string value)
{            
   var reversedBytes = System.Net.IPAddress.NetworkToHostOrder(Convert.ToInt32(value)); 
   var littleEndienSerialNumber = reversedBytes.ToString("x");    
   return  littleEndienSerialNumber.PadLeft(8, '0').ToUpper();
}

对于浮点数,我不能在 NetworkHostOrder 中给出浮点值,因为它需要一个整数。

所以我找到了下面的代码

private string ConverToLittleendian(float value)
{ 
   byte[] bytes = BitConverter.GetBytes(value);
   Array.Reverse(bytes);
   return BitConverter.ToString(bytes).Replace("-", "");
}

它以某种方式给出了错误的值。我已经用 1234 测试了这些方法(我知道它不是浮点数,但在这种情况下,它应该有效)

第一种方法我得到的结果是D2040000 第二种方法我得到结果 449A4000

不知道为什么不一样。我想确定当我将一个真正的 float 值转换为 little endian 时,我需要获得正确的值。

我哪里做错了?

我认为您可能对二进制表示数字的方式感到困惑。

浮点数(在 C# 中)使用 IEEE 754 以二进制表示它们 - 广义上这是(在大端):

{sign}{exponent}{mantissa}.

整数比这更基本 - 有符号整数表示为:

{sign}(mantissa}.

1234 作为大端的浮点数 is 0x449A40000x00409A44 小端。

1234 作为 int is 0x000004D2 大端; 0xD2040000 小端字节序(正如您的结果)。


您不会期望 1234(整数)与 1234.0(浮点数)具有相同的二进制表示形式,因为在内部,它们的存储方式不同。

如果 1234(作为一个整数)和 1234.0(一个浮点数)具有相同的二进制表示,您会期望 1235 在 int 表示中有一位不同(它 is 0x000004D3 在 big-endian 中; 0xD3040000 在小端)。

但是 1234.5(浮点数)会让你去哪里?使用整数表示最接近的是 0x000004D2.8.8 是十进制的 .5 的十六进制等价物)。 0x000004D20x000004D3 之间不能有完整的二进制数。这就是 floating-point arithmetic 的用武之地 - 也是两者不同的原因。