- A+
所属分类:.NET技术
前言
上位机开发过程中,格式转换是必不可少的重要环节,经常是十进制转十六进制、十六进制转byte
数组又转换回来来回转换,最然进制转换很基础同时 C# 也提供了很多直接方便进行格式转换的方法,但是封装一个工具类会方便很多,不用每次都手写代码逻辑,之前一直都是简单的自己写,稍复杂的就用前辈写好的直接调用,这次自己写一个。
简单的定义为一行代码完事,多一行都不写?。
编写类方法
工具类就叫ByteArrayConversion
吧,我就按照开发程序的过程中需要用到的方法顺序写了,后面再把完整的类方法贴出来。
十六进制字符串转字节数组
/// <summary> /// 十六进制字符串转字节数组 /// </summary> /// <param name="data">以空格分隔的十六进制字符串</param> /// <returns>转换后的字节数组</returns> public static byte[] HexStringToByteArray(string data) { string[] chars = data.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); byte[] outBytes = new byte[chars.Length]; for (int i = 0; i < chars.Length; i++) { outBytes[i] = Convert.ToByte(chars[i], 16); } return outBytes; } }
代码解读:
- 方法的输入是一个名为 "data" 的字符串,表示要转换的十六进制值。
- 使用
Split
方法将 "data" 字符串按空格字符 (' ') 分割为子字符串数组。使用StringSplitOptions.RemoveEmptyEntries
选项可以去除由连续空格导致的空条目。 - 创建一个名为 "outBytes" 的字节数组,其长度与从拆分操作获得的子字符串数量相等。
- 方法随后通过使用
for
循环遍历 "chars" 数组中的每个子字符串。 - 在循环内部,使用
Convert.ToByte
方法将每个子字符串(表示一个十六进制值)转换为一个字节,使用基数 16(十六进制)作为第二个参数。得到的字节值被存储在 "outBytes" 数组的相应索引位置。 - 最后,返回包含转换后的字节值的 "outBytes" 字节数组。
注意:这个方法假设输入的 "data" 字符串包含有效的十六进制值,并且这些值之间用空格分隔。如果输入包含任何非十六进制字符或者字符数不为偶数,可能会导致运行时异常。
字节数组转十六进制字符串
/// <summary> /// 字节数组转十六进制字符串 /// </summary> /// <param name="data"></param> /// <returns></returns> public static string ByteArrayToHexString(byte[] data) { StringBuilder hexString = new StringBuilder(); for (int i = 0; i < data.Length; i++) { hexString.Append(data[i].ToString("X2") + " "); } return hexString.ToString().Trim(); }
代码解读:
- 方法的输入是一个名为 "data" 的字节数组,表示要转换为十六进制字符串的数据。
- 创建一个名为 "hexString" 的
StringBuilder
对象,用于存储转换后的十六进制字符串。 - 使用
for
循环遍历 "data" 数组中的每个字节。 - 在循环内部,使用
Append
方法将每个字节的十六进制表示形式追加到 "hexString" 中。ToString
方法中的参数 "X2" 表示将字节转换为两位的大写十六进制字符串,其中的 "X" 表示大写字母表示法,"2" 表示每个字节使用两位。这里也可以这样写hexString.Append(string.Format("{0:X2} ",data[i]));
- 最后,使用
ToString
方法将 "hexString" 对象转换为字符串,并返回转换后的十六进制字符串。
注意:这个方法将字节数组中的每个字节转换为对应的两位十六进制字符串表示形式,并将它们连接起来形成一个完整的十六进制字符串。
十六进制字符串转十进制字符串
/// <summary> /// 十六进制字符串转十进制字符串数组 /// </summary> /// <param name="data">十六进制字符串</param> /// <param name="WithSpace">各字符间是否带有空格</param> /// <returns>转换后的十进制字符串</returns> public static string[] HexStringToDecimal(string data, bool WithSpace) { if (!WithSpace) { data = InsertFormat(data, 2, " "); } string[] dataSet = data.Split(' '); for (int i = 0; i < dataSet.Length; i++) { dataSet[i] = Convert.ToInt16(dataSet[i], 16).ToString(); } return dataSet; }
代码解读:
-
如果
WithSpace
参数为false
,则调用InsertFormat
函数,在data
参数中每两个字符之间插入一个空格,使得十六进制字符串中的每两个字符都能够对应一个十进制字符串。这一步是可选的,根据WithSpace
参数的值来决定是否执行。 -
使用空格字符
' '
作为分隔符,将处理后的data
字符串拆分为一个字符串数组dataSet
,每个元素包含一个十六进制字符串。 -
遍历
dataSet
数组,对每个元素执行以下操作:
- 调用
Convert.ToInt16
方法将当前的十六进制字符串转换为对应的十进制整数,并将结果转换为字符串。 - 将转换后的十进制字符串赋值给
dataSet
数组的当前元素。
- 调用
-
返回包含转换结果的
dataSet
字符串数组。
InsertFormat 方法:
public static string InsertFormat(string str_Input, int interval, string value) { for (int i = interval; i < str_Input.Length; i += interval + 1) { str_Input = str_Input.Insert(i, value); } return str_Input; }