我现在需要发送一个double数据,通过socket发送,但是是网络字节序,但是C#并没有提供相关的api,这里,我想到一个思路,
由于long 也是8个字节,所以,我先把double转成内存一样的long数据,再转成网络字节序的long 最后,再转成内存一样大的double,
实例如下:
static Double DoubleHostToNetworkOrder(Double host)
{
var bd = BitConverter.GetBytes(host);
long ld = BitConverter.ToInt64(bd, 0);
var netLd = IPAddress.HostToNetworkOrder(ld);
var netbd = BitConverter.GetBytes(netLd);
return BitConverter.ToDouble(netbd, 0);
}
看内存情况,double的本机内存情况
double的网络字节序内存情况
两者的顺序发生了颠倒。
所以返回的值应该是正确的。
再写一个把网络字节序的double转成本机字节序的例子:
static Double DoubleNetworkToHostOrder(Double network)
{
var bd = BitConverter.GetBytes(network);
long ld = BitConverter.ToInt64(bd, 0);
var HostLd = IPAddress.NetworkToHostOrder(ld);
var Hostbd = BitConverter.GetBytes(HostLd);
return BitConverter.ToDouble(Hostbd, 0);
}
结果输出如下:
我们可以发现,结果是正确的。
******************************总结****************************
C#没有提供double的网络字节序转换方法,但是我们可以通过long的网络字节序转换方法,来变通的实现double的网络字节序的转换方法。这里记住一点,内存是不会骗人的,其实的该怎么转换就怎么转换。