第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;
            }
        }
    }
posted @ 2024-10-23 16:36  似梦亦非梦  阅读(18)  评论(0编辑  收藏  举报