【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)也可以
(3)int、uint直接用 BitConverter.GetBytes()获取字节是对的
字节转回数据时直接用
data = (int)((sendbyte[index++] << 8) + sendbyte[index++]);
来源:https://www.itdaan.com/blog/2016/07/05/a28b7b554553765e95d56a4e59ffa3ff.html
double类型与字节数组的互相转换
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!