16进制字节和数字转换
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; }