第42篇 字元與進位制之間的轉換

似梦亦非梦發表於2024-10-23

用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;
            }
        }
    }

相關文章