一、數組解析
我本意是把用戶輸入的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類型與字節數組的互相轉換