一、基礎知識
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
b、十六進位制值,輸出:138a
c、十六進位制 to 十進位制,輸出5002
c、按位輸出:[0]=138、[1]=19、[2]=0、[3]=0 注意:每位=8bit,4位一組,4*8=32位,二進位制完整表示為:00000000 00000000 00010011 10001010
綜上,先把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
在記憶體中,數值型資料次序與陣列是相反的,即低位元組在前面,高位元組在後面。
在記憶體中是(用 16 進製表示)8a ,13,當把這2個位元組(從buffer位元組陣列下標為0開始)當成 int16 時,為 138a(十進位制的 5002).
總結:也就是從陣列中取下標為0以後的兩個位元組,先各位元組轉換為16進位制,然後倒序組合,轉換為10進位制。
(十進位制 -> 十六進位制 -> 倒序 -> 十進位制)
so:ToUInt16取2個位元組,ToUInt32 取4個位元組。ToUInt64 取8個位元組,UInt表示無符號整數,無負數範圍。