【C#】使用BitConverter.GetBytes转换double到byte[]中,得到的数据怎么理解

一、数组解析

我本意是把用户输入的0xFAADCEAE 转换为 byte[]数组的,那么转换出来的按理应该是
byte[0] AE
byte[1] CE
byte[2] AD
byte[3] FA
byte[4] 0
byte[5] 0
byte[6] 0
byte[7] 0


结果我得到了这么个东西:
byte[0] OCT: 000 HEX: 0
byte[1] OCT: 000 HEX: 0
byte[2] OCT: 192 HEX: c0
byte[3] OCT: 213 HEX: d5
byte[4] OCT: 185 HEX: b9
byte[5] OCT: 085 HEX: 55
byte[6] OCT: 239 HEX: ef
byte[7] OCT: 065 HEX: 41


和我的预期严重不符。于是我做了个简单的测试,输入1,进行了尝试,得到了下面的值


byte[0] OCT: 000 HEX: 0
byte[1] OCT: 000 HEX: 0
byte[2] OCT: 000 HEX: 0
byte[3] OCT: 000 HEX: 0
byte[4] OCT: 000 HEX: 0
byte[5] OCT: 000 HEX: 0
byte[6] OCT: 240 HEX: f0
byte[7] OCT: 063 HEX: 3f


一个1,怎么会有一个高位如此之大的数?
原因就是,我把double是什么东西给忘了!
double是双精度浮点数是浮点数啊,怎么可能是一般的表现形式,明显有什么符号位啊、指数啊、尾数啊!至此,这么个奇怪的byte[]已经水落石出了,为了不辜负大学老师的辛勤,我把课本拾起来,接下来回忆下一个简单的1是怎么变成这么个样子的:

 

请参考double数据格式:

 

 

 所以使用double是不正确的,应该使用Int64,才能达到我们的目的。

 

二、编程过程中double类型与字节数组的互相转换

 

1)该参数占多字节

 

不能直接用 BitConverter.GetBytes(),获取字节错误。

 

①有小数的情况

 

*10后转换为short类型,再调用BitConverter.GetBytes()获取字节

 

转回数据可用BitConverter.ToInt16(),记得除以10

 

    

 

②没有小数的情况

 

转换为short类型,再调用BitConverter.GetBytes()获取字节

 

转回数据可用BitConverter.ToInt16()

 

 

 

以上解决方案包含有负数的情况(负数至少需要2个字节)。

 

 

 

2)该参数占1个字节

 

①有小数的情况

 

*10后用(byte)强制转换为字节

 

转回数据直接用字节/10

 

 

 

②没有小数的情况

 

byte)强制转换为字节

 

转回数据直接用(double)强制转换或不加(double)也可以

 

 

 

3intuint直接用 BitConverter.GetBytes()获取字节是对的

 

字节转回数据时直接用

 

data = (int)((sendbyte[index++] << 8) + sendbyte[index++]);

 

 

来源:https://www.itdaan.com/blog/2016/07/05/a28b7b554553765e95d56a4e59ffa3ff.html

double类型与字节数组的互相转换

posted @ 2022-03-23 09:39  不溯流光  阅读(1023)  评论(0编辑  收藏  举报