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