第42篇 字符与进制之间的转换
用C#语言,简单封装了一个扩展类,方便使用
public static class BinaryConvertExtension
{
public static int BinaryIndex = 16; //默认16进制
/// <summary>
/// 将字符串转换为16进制
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string StringToHex(this string input)
{
try
{
if (string.IsNullOrEmpty(input)) return input;
input = input.Trim();
StringBuilder hex = new StringBuilder();
foreach (char c in input)
{
//获取字符的Unicode编码,并将其转换为16进制表示,'20'表示一个空格' '
hex.Append(((int)c).ToString("X2"));
}
return hex.ToString();
}
catch (Exception ex)
{
JsonLogger.ComMessageLog($"转换前数据[{input}],{BinaryIndex}进制转换异常:" + ex.Message);
return string.Empty;
}
}
/// <summary>
/// 将16进制字符串转换为原始字符串
/// </summary>
/// <param name="hex"></param>
/// <returns></returns>
public static string HexToString(this string input)
{
try
{
if (string.IsNullOrEmpty(input)) return input;
input = input.Trim();
// 创建一个字节数组来存储解析出来的字节
byte[] bytes = new byte[input.Length / 2];
// 每两个字符代表一个字节,因此循环长度是 hex.Length / 2
for (int i = 0; i < input.Length; i += 2)
{
// 提取每两个字符,转换为字节
bytes[i / 2] = Convert.ToByte(input.Substring(i, 2), 16);
}
// 将字节数组转换为字符串
return Encoding.UTF8.GetString(bytes);
}
catch (Exception ex)
{
JsonLogger.ComMessageLog($"转换前数据[{input}],{BinaryIndex}进制转换异常:" + ex.Message);
return string.Empty;
}
}
/// <summary>
/// 将字符串转为10进制
/// </summary>
/// <param name="decimalString"></param>
/// <returns></returns>
public static string StringToDecimal(this string decimalString)
{
try
{
if (string.IsNullOrEmpty(decimalString)) return decimalString;
decimalString = decimalString.Trim();
string result = string.Empty;
// 去掉字符串两端的空白并按空格分割
string[] parts = decimalString.Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string part in parts)
{
if (int.TryParse(part, out int res))
{
result += res.ToString() + " ";
}
else
{
//Console.WriteLine($"转换失败,'{decimalString}' 不是有效的10进制字符串");
return string.Empty;
}
}
//Console.WriteLine($"转换成功,'{decimalString}' 的结果是: {result.Trim()}");
return result;
}
catch (Exception ex)
{
JsonLogger.ComMessageLog($"转换前数据[{decimalString}],{BinaryIndex}进制转换异常:" + ex.Message);
return string.Empty;
}
}
/// <summary>
/// 将10进制转换为原始字符串
/// </summary>
/// <param name="decimalString"></param>
/// <returns></returns>
public static string DecimalStringToChar(this string decimalString)
{
try
{
if (string.IsNullOrEmpty(decimalString)) return decimalString;
decimalString = decimalString.Trim();
//将字符串按空格分割为一个字符串数组
string[] decimalNumbers = decimalString.Split(' ');
//创建一个字符数组来存储转换后的字符
char[] characters = new char[decimalNumbers.Length];
//遍历每个数字,将其转换为字符
for (int i = 0; i < decimalNumbers.Length; i++)
{
if (int.TryParse(decimalNumbers[i], out int decimalNumber))
{
characters[i] = Convert.ToChar(decimalNumber); // 将10进制数转换为字符
}
else
{
//Console.WriteLine($"无法将字符串 '{decimalNumbers[i]}' 转换为10进制数。");
return string.Empty;
}
}
//将字符数组转换为字符串
return new string(characters);
}
catch (Exception ex)
{
JsonLogger.ComMessageLog($"转换前数据[{decimalString}],{BinaryIndex}进制转换异常:" + ex.Message);
return string.Empty;
}
}
/// <summary>
/// 字符串转换为2进制
/// </summary>
/// <returns></returns>
public static string StringToBinaryChars(this string input)
{
try
{
if (string.IsNullOrEmpty(input)) return input;
StringBuilder binary = new StringBuilder();
//将字符串按空格分割
string[] parts = input.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
//遍历每个部分
foreach (string part in parts)
{
//遍历字符,将每个字符转换为二进制
foreach (char c in part)
{
//将字符转换为二进制字符串并补齐到8位
string binaryChar = Convert.ToString(c, 2).PadLeft(8, '0');
binary.Append(binaryChar + " "); //在每个字节后加空格
}
binary.Append(" "); //在每个单词末尾加空格
}
return binary.ToString().Trim(); //返回去掉尾部空格的结果
}
catch (Exception ex)
{
JsonLogger.ComMessageLog($"转换前数据[{input}],{BinaryIndex}进制转换异常:" + ex.Message);
return string.Empty;
}
}
/// <summary>
/// 2进制转换成原始字符
/// 1.将2进制字符串分割成每8位一组,代表一个字节。
/// 2.将每个字节的2进制部分转换为对应的10进制数字。
/// 3.将10进制数字转换为对应的字符。
/// </summary>
/// <param name="binaryString"></param>
/// <returns></returns>
public static string BinaryStringToChars(this string binaryString)
{
try
{
// 将二进制字符串按空格分割为一个字符串数组
string[] binaryNumbers = binaryString.Split(' ');
// 创建一个字符数组来存储转换后的字符
char[] characters = new char[binaryNumbers.Length];
// 遍历每个二进制数字
for (int i = 0; i < binaryNumbers.Length; i++)
{
// 将二进制字符串转换为10进制数字
int decimalNumber = Convert.ToInt32(binaryNumbers[i], 2);
// 将10进制数字转换为对应字符
characters[i] = Convert.ToChar(decimalNumber);
}
// 将字符数组转换为字符串
return new string(characters);
}
catch (Exception ex)
{
JsonLogger.ComMessageLog($"转换前数据[{binaryString}],{BinaryIndex}进制转换异常:" + ex.Message);
return string.Empty;
}
}
/// <summary>
/// 判读字符串是否16进制(16进制字符串通常以0x或0X开头,后面跟随的字符是0-9和A-F(不区分大小写))
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsHexadecimal(this string input)
{
// 匹配以0x或0X开头,接着是0-9,a-f,A-F
return Regex.IsMatch(input, @"^(0[xX])?[0-9A-Fa-f]+$");
}
/// <summary>
/// 判断字符串是否10进制(10进制字符串只包含数字0-9,且不能以0开头(除非字符串是"0"本身))
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsDecimal(this string input)
{
// 匹配以0x或0X开头,接着是0-9,a-f,A-F
return Regex.IsMatch(input, @"^(0[xX])?[0-9A-Fa-f]+$");
}
/// <summary>
/// 判断字符串是否2进制(仅包含数字:字符串只能由0和1组成,可以选择性地以0b或0B作为前缀来表示这是一个二进制数。)
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsBinary(this string input)
{
// 匹配以0b或0B开头,后面是0或1
return Regex.IsMatch(input, @"^(0[bB])?[01]+$");
}
///// <summary>
///// 判断字符串属于什么进制
///// </summary>
///// <param name="str"></param>
///// <returns></returns>
//public static string IdentifyNumberBase(this string input)
//{
// if (Regex.IsMatch(input, @"^(0[bB])?[01]+$")) //2进制
// return "Binary";
// else if (Regex.IsMatch(input, @"^(0[xX])?[0-9A-Fa-f]+$")) //16进制
// return "Hexadecimal";
// else if (Regex.IsMatch(input, @"^(0|[1-9][0-9]*)$")) //10进制
// return "Decimal";
// else
// return "Not a valid number format";
//}
/// <summary>
/// 串口命令 字符串转换成进制数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string StringConvertToBinary(this string input)
{
if (string.IsNullOrEmpty(input)) return input;
input = input.Trim();
string result = string.Empty;
switch (BinaryIndex)
{
case 0:
result = input;
break;
case 2:
result = StringToBinaryChars(input);
break;
case 10:
result = StringToDecimal(input);
break;
case 16:
result = StringToHex(input);
break;
default:
break;
}
return result;
}
/// <summary>
/// 判断串口返回的字符串属于什么进制,并转换成原始字符
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string GetBinaryToString(this string input)
{
if (string.IsNullOrEmpty(input)) return input;
input = input.Trim();
if (Regex.IsMatch(input, @"^([01]{8}( [01]{8})*)?$")) //2进制
{
//Console.WriteLine($"2进制字符串: {input}");
input = BinaryStringToChars(input);
//Console.WriteLine($"对应字符: {input}");
return input;
}
//Regex.IsMatch(str, @"^(0|[1-9][0-9]*)$")
else if (Regex.IsMatch(input, @"^(\d+)( \d+)*$")) //10进制
{
//Console.WriteLine($"10进制字符串: {input}");
input = DecimalStringToChar(input);
//Console.WriteLine($"对应字符: {input}");
return input;
}
else if (Regex.IsMatch(input, @"^(0[xX])?[0-9A-Fa-f]+$")) //16进制
{
//Console.WriteLine($"16进制字符串: {input}");
input = HexToString(input);
//Console.WriteLine($"对应字符: {input}");
return input;
}
else
{
//Console.WriteLine($"Not a valid number format");
return input;
}
}
}