byte位元組陣列 轉換成double型別

Peter-H發表於2017-01-31

例子

byte[] byteArray = {64,   47,   215,   10,   61,   112,   163,   215};

Array.Reverse(byteArray);

var result = BitConverter.ToDouble(byteArray, 0);  // 結果為15.92

位元組轉換

BitConverter.ToDouble 方法 (Byte[], Int32)

返回雙精度浮點數字八個位元組轉換的位元組陣列中指定的位置。

public static double ToDouble(
	byte[] value,
	int startIndex
)
引數:value,Type: System.Byte[]  位元組陣列。
        startIndex,Type: System.Int32 ,value 內的起始位置。
返回值:Type: System.Double由開始的八個位元組構成的雙精度浮點數 startIndex。
ToDouble 方法將位元組轉換從索引 startIndex 到 startIndex + 7 到 Double 值。位元組陣列中的順序必須反映計算機系統的體系結構; 

順序由BitConverter.IsLittleEndian 欄位來反映

指示資料儲存在此計算機體系結構中的位元組順序(“endianness”)。如果體系結構是 little-endian,則為 true;如果體系結構是 big-endian,則為 false

Little-Endian與Big-Endian

a) Little-Endian就是低位位元組排放在記憶體的低地址端,高位位元組排放在記憶體的高地址端。
b) Big-Endian就是高位位元組排放在記憶體的低地址端,低位位元組排放在記憶體的高地址端。

記憶體中:棧是向下增長的,而堆是向上增長的。

在棧 上分配一個unsigned char buf[4],那麼這個陣列變數在棧上是如何佈局的呢?看下圖:
棧底 (高地址)
----------
buf[3]
buf[2]
buf[1]
buf[0]

----------
棧頂 (低地址)


在十進位制中我們都說靠左邊的是高位,靠右邊的是低位,在其他進位制也是如此。就拿 0x12345678來說,

從高位到低位的位元組依次是0x12、0x34、0x56和0x78。

以unsigned int value = 0x12345678為例,分別看看在兩種位元組序下其儲存情況,我們可以用unsigned char buf[4]來表示value:

Little-Endian: 低地址存放低位,如下圖:
棧底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
棧 頂 (低地址)

Big-Endian: 低地址存放高位,如下圖:
棧底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
棧頂 (低地址)

相關文章