【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類型與字節數組的互相轉換


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM