一、字节数组转换为等效的16进制字符串
在串口通信中遇到的一个比较常见的问题就是需要把字节流转换为字符串的问题,不管是需要将接受到的数据打印到log还是需要将字符串显示到Demo上,遇到这种问题还要自己写一个转换函数太过于麻烦,那么标准库中是否有相关函数可以直接转化呢?
1、Convert.ToString(byte value, IFormatProvider provider)
// 摘要:
// 使用指定的区域性特定格式设置信息,将指定的 8 位无符号整数的值转换为其等效的字符串表示形式。
// 参数:
// value:
// 要转换的 8 位无符号整数。
// provider:
// 一个提供区域性特定的格式设置信息的对象。
// 返回结果:
// value 的字符串表示形式。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
byte[] a = { 0x1A, 0x2B, 0x3c, 0x4d, 0x5f };
string str = "";
foreach (byte aa in a)
{
str += Convert.ToString(aa,16);
}
Console.WriteLine(str);
Console.ReadLine();
}
}
}
运行结果如下:
该函数缺点是不支持自定义格式的修改,比如转换为大写形式、补0之类的功能。
2、ToString(string format)
// 摘要:
// 使用指定的格式将当前 System.Byte 对象的值转换为它的等效字符串表示形式。
// 参数:
// format:
// 一个数值格式字符串。
// 返回结果:
// 按照 System.Byte 参数指定的方式进行格式设置的当前 format 对象的字符串表示形式。
// 异常:
// T:System.FormatException:
// format 包含不受支持的说明符。 “备注”部分中列出了受支持的格式说明符。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
byte[] a = { 0x0A, 0x1B, 0x2C, 0x3d, 0x4e, 0x5f };
string str = "";
foreach (byte aa in a)
{
str += aa.ToString("x2");
}
Console.WriteLine(str);
str = "";
foreach (byte aa in a)
{
str += aa.ToString("X2");
}
Console.WriteLine(str);
Console.ReadLine();
}
}
}
运行结果如下:
这种方法转换较第一种功能多了很多,只要设置相应的转换格式,即可得到自己希望得到的样子。
关于更多ToString() 函数参数的格式,请参阅C# byte转为16进制字符串~~~ToString()格式
这种方法不可避免的还是需要借助一个循环来把字节数组中的字节一个一个转化为16进制数字,那么有没有方法能直接一行就完成这个转化呢?
接下来就是重点要介绍的
3、public static string ToString(byte[] value);
// 摘要:
// 将指定的字节数组的每个元素的数值转换为其等效的十六进制字符串表示形式。
// 参数:
// value:
// 字节数组。
// 返回结果:
// 十六进制对字符串连字符分隔的其中的每个对表示中的相应元素value; 例如,"7F-2c-4A-00"。
// 异常:
// T:System.ArgumentNullException:
// value 为 null。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
byte[] a = { 0x0A, 0x1B, 0x2C, 0x3d, 0x4e, 0x5f };
string str = BitConverter.ToString(a);
Console.WriteLine(str);
Console.ReadLine();
}
}
}
运行结果如下:
这样,就实现了只需要一行即可将字节数组转化为16进制数字格式的字符串了。此函数还有其他重载函数,支持指定位置、指定长度进行转化。
当然,缺点就是也不支持自定义的格式,只能忍受每个字节中间都有一个“-”了。
二、16进制字符串怎样转化为等效的字节数组
据作者所知,应该是没有办法直接将16进制字符串转化为等效的字节数组的,所以我们只能一个字节一个字节的转化
可以使用byte.Parse()方法,例如:byte.Parse("3f")或byte.Parse("3f", NumberStyles.HexNumber)
byte[] HexStrToArray(string HexStr)
{
List<byte> HexArray = new List<byte>();
for (int i = 0; i < HexStr.Length; i += 2)
{
try
{
HexArray.Add(byte.Parse(HexStr.Substring(i, 2)));
}
catch
{
//不要相信传进来的字符串一定是标准的
return HexArray.ToArray();
}
}
return HexArray.ToArray();
}