16进制字节和数字转换
16进制数据和数字的转换包含整数(有符号短整型short、⽆符号短整型ushort、有符号整型int、⽆符号整型uint、有符号长整型long、⽆符号长整型ulong)和⼩数(单精度浮点float和双精度浮点)。
⾸先在进⾏数据转换之前先要明确以下数据类型:
下表是对以上提到的数据类型的介绍:
类型范围⼤⼩字节数Framework类型
short-32768 到  32767有符号16位
整数
2字节System.Int16
ushort0 到 65535⽆符号16位
整数
2字节System.UInt16
int-
2147483648 到 2147483647带符号的32
位整数
4字节System.Int32
uint0 到 4294967295⽆符号32位
整数
4字节System.UInt32
long-9223372036854775808到
922337203685477580764位带符号
整数
8位System.Int64
ulong0 到
18446744073709551615⽆符号64位
整数
8位System.UInt64
float-3.4 *1038 到  3.4*1038单精度浮点4位System.Single
float几个字节多少位
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;
}