16進制數據和數字的轉換包含整數(有符號短整型short、無符號短整型ushort、有符號整型int、無符號整型uint、有符號長整型long、無符號長整型ulong)和小數(單精度浮點float和雙精度浮點)。
首先在進行數據轉換之前先要明確以下數據類型:
下表是對以上提到的數據類型的介紹:
類型 |
范圍 |
大小 |
字節數 |
Framework類型 |
short |
-32768 到 32767 |
有符號16位整數 |
2字節 |
System.Int16 |
ushort |
0 到 65535 |
無符號16位整數 |
2字節 |
System.UInt16 |
int |
-2147483648 到 2147483647 |
帶符號的32位整數 |
4字節 |
System.Int32 |
uint |
0 到 4294967295 |
無符號32位整數 |
4字節 |
System.UInt32 |
long |
-9223372036854775808到 9223372036854775807 |
64位帶符號整數 |
8位 |
System.Int64 |
ulong |
0 到 18446744073709551615 |
無符號64位整數 |
8位 |
System.UInt64 |
float |
-3.4 *1038 到 3.4*1038 |
單精度浮點 |
4位 |
System.Single |
double |
±5.0*10-324 到 ±1.7*10308 |
雙精度浮點 |
8位 |
System.Double |
8位二進制 字節 字 雙字的數據轉換:
8位二進制 = 1字節
2字節 = 字
2字 = 雙字
2雙字 = 4字
在串口通訊或其他的應用場景下,將字節轉換為數字過程中會存在字節順序的變換,字節高低位轉換或字的高低位轉換,所以在數據轉換的時候要注意字節的順序。在C#中可以使用BitConverter類輕松的進行數據轉換。
參考MSDN的BitConverter類
名稱 |
說明 |
將指定的雙精度浮點數轉換為 64 位有符號整數。 |
|
字節數組的形式返回指定的布爾值。 |
|
字節數組形式返回指定的 Unicode 字符值。 |
|
字節數組形式返回指定的雙精度浮點值。 |
|
字節數組形式返回指定的 16 位有符號的整數值。 |
|
字節數組形式返回指定的 32 位有符號的整數值。 |
|
以字節數組的形式返回指定 64 位帶符號整數值。 |
|
字節數組形式返回指定的單精度浮點值。 |
|
字節數組形式返回指定的 16 位無符號的整數值。 |
|
字節數組形式返回指定的 32 位無符號的整數值。 |
|
字節數組形式返回指定的 64 位無符號的整數值。 |
|
將指定的 64 位有符號的整數轉換為雙精度浮點數。 |
|
返回一個布爾值,從字節數組中的指定位置處的字節轉換。 |
|
返回從字節數組中指定位置處的兩個字節轉換的 Unicode 字符。 |
|
返回從字節數組中指定位置的八個字節轉換來雙精度浮點數。 |
|
返回轉換的字節數組中指定位置處的兩個字節從一個 16 位帶符號的整數。 |
|
返回轉換的字節數組中指定位置處的四個字節從 32 位有符號的整數。 |
|
返回轉換的字節數組中指定位置處的八個字節從一個 64 位帶符號的整數。 |
|
返回從字節數組中指定位置的四個字節轉換來單精度浮點數。 |
|
將指定的字節數組的每個元素的數值轉換為其等效的十六進制字符串表示形式。 |
|
將字節的指定子數組的每個元素的數值轉換為其等效的十六進制字符串表示形式。 |
|
將字節的指定子數組的每個元素的數值轉換為其等效的十六進制字符串表示形式。 |
|
返回從字節數組中指定位置處的兩個字節轉換的 16 位無符號的整數。 |
|
返回從字節數組中指定位置的四個字節轉換的 32 位無符號的整數。 |
|
返回從字節數組中指定位置的八個字節轉換的 64 位無符號的整數。 |
下面是具體的實現:
//8字節16進制字符串 string strHex = "32 CA B2 CA DE FA AD ff"; //將上面的16進制字符串轉換為字節數組 byte[] bytes = GetBytes(strHex); strHex.Replace(" ", ""); //前兩個字節分別轉換為ushort 和short Console.WriteLine("將前兩個字節數組{0}轉換為ushort:{1}", strHex.Substring(0, 2), BitConverter.ToUInt16(bytes, 0)); Console.WriteLine("將前兩個字節數組{0}轉換為short:{1}", strHex.Substring(0, 2), BitConverter.ToInt16(bytes, 0)); //前四個字節分別轉換為uint 和int Console.WriteLine("將前四個字節數組{0}轉換為uint:{1}", strHex.Substring(0, 4), BitConverter.ToUInt32(bytes, 0)); Console.WriteLine("將前四個字節數組{0}轉換為int:{1}", strHex.Substring(0, 4), BitConverter.ToInt32(bytes, 0)); //前八個字節分別轉換為ulong 和long Console.WriteLine("將前八個字節數組{0}轉換為ulong:{1}", strHex, BitConverter.ToUInt64(bytes, 0)); Console.WriteLine("將前八個字節數組{0}轉換為long:{1}", strHex, BitConverter.ToInt64(bytes, 0)); //前四個字節轉換為float Console.WriteLine("將前四個字節數組{0}轉換為float:{1}", strHex.Substring(0, 4), BitConverter.ToSingle(bytes, 0)); //前八個字節轉換為double Console.WriteLine("將前八個字節數組{0}轉換為double:{1}", strHex, BitConverter.ToDouble(bytes, 0));
/// <summary> /// 將16進制字符串轉換為字節數組 /// </summary> /// <param name="strHex">16進制字符串</param> /// <returns></returns> public static byte[] GetBytes(string strHex) { if (string.IsNullOrWhiteSpace(strHex)) return null; strHex = strHex.Replace(" ", ""); byte[] bytes = new byte[strHex.Length / 2]; for (int i = 0; i < strHex.Length; i += 2) { bytes[i / 2] = Convert.ToByte(strHex.Substring(i, 2), 16); } return bytes; }