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 0x449A4000
; 0x00409A44
小端。
1234 作为 int is 0x000004D2
大端; 0xD2040000
小端字节序(正如您的结果)。
您不会期望 1234(整数)与 1234.0(浮点数)具有相同的二进制表示形式,因为在内部,它们的存储方式不同。
如果 1234(作为一个整数)和 1234.0(一个浮点数)具有相同的二进制表示,您会期望 1235 在 int 表示中有一位不同(它 is 0x000004D3
在 big-endian 中; 0xD3040000
在小端)。
但是 1234.5(浮点数)会让你去哪里?使用整数表示最接近的是 0x000004D2.8
(.8
是十进制的 .5 的十六进制等价物)。 0x000004D2
和 0x000004D3
之间不能有完整的二进制数。这就是 floating-point arithmetic 的用武之地 - 也是两者不同的原因。
我想将一些值转换为小端。我对将 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 0x449A4000
; 0x00409A44
小端。
1234 作为 int is 0x000004D2
大端; 0xD2040000
小端字节序(正如您的结果)。
您不会期望 1234(整数)与 1234.0(浮点数)具有相同的二进制表示形式,因为在内部,它们的存储方式不同。
如果 1234(作为一个整数)和 1234.0(一个浮点数)具有相同的二进制表示,您会期望 1235 在 int 表示中有一位不同(它 is 0x000004D3
在 big-endian 中; 0xD3040000
在小端)。
但是 1234.5(浮点数)会让你去哪里?使用整数表示最接近的是 0x000004D2.8
(.8
是十进制的 .5 的十六进制等价物)。 0x000004D2
和 0x000004D3
之间不能有完整的二进制数。这就是 floating-point arithmetic 的用武之地 - 也是两者不同的原因。