目录
TryParse
正常来说,想把类似1024
或者3.14
之类的字符串转为对应数据类型的数值,只需要int.Parse
或double.Parse
就可以了。如果输入的是一列数组,也没有问题,只需分割一下就可以,例如
string test = "5,2,0"; int i = 0; foreach(var item in test.Split(',')) bs[i++] = int.Parse(item);
而且转换16进制也毫无压力,只需
int.Parse("AB", System.Globalization.NumberStyles.HexNumber);
在C#中,Parse
是一种非常统一的函数,诸如int, uint, double
等等数据类型,均提供了parse
函数,用于将字符串转化为相应的数据类型。
但parse
并不安全,若输入参数不符合要求,则会报错,导致程序崩溃,比如把abc
转成整数,这个显然是不可能的。所以C#
提供了一种不报错的转换方案,即TryParse
,其使用方法如下
int intOut; while (true) { string? str = Console.ReadLine(); if (int.TryParse(str, out intOut)) Console.WriteLine($"您输入了数字{str}"); else Console.WriteLine("输入不合法"); }
效果为
1234
您输入了数字1234
asdf
输入不合法
Convert
在实际应用中,十六进制字符串转字节数组,是十分常见的需求,如果用byte.Parse
相对来说比较麻烦,这个时候就需要用到更高级的转换函数Convert
了,其调用非常简单,先来演示一下单个值的转换
int intOut = Convert.ToByte("AB", 16);
16表示16进制,Convert
系列函数,支持2, 8, 10以及16这几种进制。
Convert
中还支持从其他类型转为字符串,仍以十六进制转换为例,下面的代码输出结果为19。
string str = Convert.ToString(25, 16); Console.WriteLine(str);
但上面这些单个数值与字符串之间的相互转换,其实并不能看出Convert
这个静态类的强大,Convert
提供的最方便的功能,其实是字节数组与字符串之间的相互转换,例如
var bs = Convert.FromHexString("6400"); foreach (var item in bs) Console.WriteLine(item);
其返回结果为
1000
其中0x64
即10进制中的100,0x00
就是0。
实战
在日常使用中,十六进制字节数组往往被写为0xAA, 0xBB
这种形式,通过String.Format
函数,可以将字节数组输出为这种格式的字符串
string str = ""; byte[] bs = new byte[] { 1, 15, 100, 127 }; foreach (var b in bs) str += $"0x{b:X},"; // $字符串和Format函数语法十分相似 Console.WriteLine(str);
输出结果为
0x01,0x0F,0x64,0x7F,
若想将其恢复为字节数组,则有两种方案,一种是将其分割为字符串数组后,逐个调用byte.Parse
,但更好的方法是直接把0x
还有,
去掉,然后调用FromHexString
str = str.Replace("0x", "").Replace(",", ""); bs = Convert.FromHexString(str) ; foreach (var b in bs) Console.WriteLine(b);
效果如下
1
15
100
127