C#中BitConverter.ToUInt16、BitConverter.ToUInt32原理與用法詳解

鄉下伢發表於2023-05-19

一、基礎知識

  a、1位元組=8位(1Byte=8bit)
     二進位制表示:11111111
     十進位制表示:255

計算機內部約定用多少位元組來規範數值,比如紅綠藍三色在計算機中只分配了一個位元組,一個位元組有八位,每一位只能儲存1或0,計算機只認識二進位制(0與1),所以就是2的八次方,計算機中約定從0開始計數,所以是0至255,長度是256.

8位 1 1 1 1 1 1 1 1
2的N次方 7 6 5 4 3 2 1 0
2^N的值(10進位制整數值) 128 64 32 16 8 4 2 1
10進位制最大數 255=128+64+32+16+8+4+2+1
10進位制最小數 0
最大長度 256=0至255,也就是2的8次方

  b、在16進位制中,每位16進位制佔用4bit

十進位制:255 
二進位制:11111111 

16進位制,每位佔用4bit

 1111  1111
16表進表示  F  F

 

二、在C#中,如何把二進位制轉換為10進位制與16進度

十進位制數5002

a、二制進值,輸出:1001110001010

C#中BitConverter.ToUInt16、BitConverter.ToUInt32原理與用法詳解

b、十六進位制值,輸出:138a

C#中BitConverter.ToUInt16、BitConverter.ToUInt32原理與用法詳解

c、十六進位制 to  十進位制,輸出5002

C#中BitConverter.ToUInt16、BitConverter.ToUInt32原理與用法詳解

c、按位輸出:[0]=138、[1]=19、[2]=0、[3]=0   注意:每位=8bit,4位一組,4*8=32位,二進位制完整表示為:00000000 00000000 00010011 10001010

C#中BitConverter.ToUInt16、BitConverter.ToUInt32原理與用法詳解

 

綜上,先把5002按位輸出,採用表格形式展現如下:

位順序 第1位 (buffer[0]) 第2位 (buffer[1]) 第3位 (buffer[2]) 第4位 (buffer[3])
十進位制值 138 19 0 0
二進位制 10001010 00010011 00000000 00000000
十六進位制 8a 13 0 0

----依據上面表格內容,逆向推演

十進位制:第4位(buffer[3]) * 256 + 第3位(buffer[2]) * 256 + 第2位(buffer[1])*256 + 第1位(buffer[0]) = 0*256 + 0*256 + 19*256 + 138 = 5002

十六進位制:倒序組合,0 0 13 8a =138a =5002       (注:組合順序,從大至小,也就是 0 0 13 8a ,與計算機中陣列表現順序相反)

------------------------------------------------------------------------

正題:C#中BitConverter.ToUInt16原理與用法

byte[] buffer = { 138, 19 };

uint highValue = BitConverter.ToUInt16(buffer, 0);  //輸出5002

C#中BitConverter.ToUInt16、BitConverter.ToUInt32原理與用法詳解

在記憶體中,數值型資料次序與陣列是相反的,即低位元組在前面,高位元組在後面。

在記憶體中是(用 16 進製表示)8a ,13,當把這2個位元組(從buffer位元組陣列下標為0開始)當成 int16 時,為 138a(十進位制的 5002).

總結:也就是從陣列中取下標為0以後的兩個位元組,先各位元組轉換為16進位制,然後倒序組合,轉換為10進位制。

(十進位制  -> 十六進位制   -> 倒序  -> 十進位制)

so:ToUInt16取2個位元組,ToUInt32 取4個位元組。ToUInt64 取8個位元組,UInt表示無符號整數,無負數範圍。

相關文章