何时使用System.Convert以及何时使用System.BitConverter

时间:2019-02-16 15:26:31

标签: c# .net

请帮助我了解Convert和BitConverter之间的区别。在下面的示例中,以上两种方法给了我两个不同的答案:

UInt64 x = 0x4028b0a3d70a3d71;

// Use Convert
double d = Convert.ToDouble(x);               // d = 4.6231392352297441E+18

// Use BitConverter
byte[] xArray = BitConverter.GetBytes(x);
double d1 = BitConverter.ToDouble(xArray, 0); // d1 = 12.345

谢谢

2 个答案:

答案 0 :(得分:1)

这两种方法用于不同的目的。 Convert.ToDouble(x)等同于强制转换:(double)x;如果您需要将整数值视为浮点值,例如对于数学运算,这将很有用:


int x = 7;
Console.WriteLine(x / 3); // 2
Console.WriteLine(Convert.ToDouble(x) / 3); // 2.3333333333333335
Console.WriteLine((double)x / 3); // 2.3333333333333335


如果要通过网络以一系列字节的形式传输值, BitConverter 类将很有用;您可以在发送端使用BitConverter.GetBytes(),在接收端使用BitConverter.To OriginalType ():

double x = 12.345;
byte[] xArray = BitConverter.GetBytes(x);

// Send xArray to another system over the network

// ...on the receiving system, presuming same endianness:
double d1 = BitConverter.ToDouble(xArray, 0); // d1 = 12.345


现在,在您的示例中,让我们看一下两种情况下x的值会发生什么:

UInt64 x = 0x4028b0a3d70a3d71;

// Use Convert
double d = Convert.ToDouble(x);               // d = 4.6231392352297441E+18

dxdouble的转换;以十进制形式表示时,科学表示法中的0x4028b0a3d70a3d71 = 4,623,139,235,229,744,497 = 4.623139235229744497 + 18这里没有魔术,这几乎是您期望发生的一切。向前。

// Use BitConverter
byte[] xArray = BitConverter.GetBytes(x);
double d1 = BitConverter.ToDouble(xArray, 0); // d1 = 12.345

...什么?好,让我们看看double类型如何存储在内存中。根据{{​​3}},格式为:

  • 第一位是符号位(0 =正; 1 =负)
  • 后11位是指数
  • 后52位是有效位(很好,是53位,但只存储了52位)

这里是0x4028b0a3d70a3d71的二进制表示形式,分为我们需要考虑的3个部分:

  

0 10000000010 1000101100001010001111010111000010100011110101110001

以下公式用于将该存储格式转换为实际数值:

(-1) sign x(1. b 51 b 50 ... b 0 base2 x 2 指数-1023

我们可以使用此IEEE 754 specification for double来代替手动进行数学运算;这是结果的快照:

awesome floating point converter

看到小数结果了吗? 12.345,与您从BitConverter.ToDouble(xArray, 0)获得的内容相同-但肯定与Convert.ToDouble(x)

执行的强制转换操作不同

答案 1 :(得分:0)

第一个: 您可以将 int hex 表示形式转换为double

第二个: 您将x中的值视为 double 的位表示形式,而不是整数。