using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CNAS_SerialPort { /// /// 16进制使用的隔离符枚举 /// public enum Enum16Hex { None,//无 Blank,//空格 OX, //OX Ox //Ox } /// /// 计算进制类助手 /// public class AlgorithmHelper { #region 十进制转十六进制 public string From10To16(int d) { string hex = ""; if (d < 16) { hex = BeginChange(d); } else { int c; int s = 0; int n = d; int temp = d; while (n >= 16) { s++; n = n / 16; } string[] m = new string[s]; int i = 0; do { c = d / 16; m[i++] = BeginChange(d % 16);//判断是否大于10,如果大于10,则转换为A~F的格式 d = c; } while (c >= 16); hex = BeginChange(d); for (int j = m.Length - 1; j >= 0; j--) { hex += m[j]; } } return hex; } //判断是否为10~15之间的数,如果是则进行转换 public string BeginChange(int d) { string hex = ""; switch (d) { case 10: hex = "A"; break; case 11: hex = "B"; break; case 12: hex = "C"; break; case 13: hex = "D"; break; case 14: hex = "E"; break; case 15: hex = "F"; break; default: hex = d.ToString(); break; } return hex; } #endregion #region 其他函数【16进制中的隔离符处理】 /// /// 把16进制隔离符转换成实际的字符串 /// /// 16进制隔离符枚举 /// private string AddSplitString(Enum16Hex enum16) { switch (enum16) { case Enum16Hex.None: return ""; case Enum16Hex.Ox: return "0x"; case Enum16Hex.OX: return "0X"; case Enum16Hex.Blank: return " "; default: return ""; } } /// /// 去掉16进制字符串中的隔离符【 如:" ", "0x", "0X"】 /// /// 需要转换的字符串数据 /// private string DeleteSplitString(string inString) { string outString = string.Empty; string[] delArray = { " ", "0x", "0X" }; if (inString.Contains(" ") || inString.Contains("0x") || inString.Contains("0X"))//存在隔离符 { string[] str = inString.Split(delArray, System.StringSplitOptions.RemoveEmptyEntries);//以隔离符进行转换数组,去掉隔离符,去掉空格。 for (int i = 0; i < str.Length; i++) { outString += str[i].ToString(); } return outString; } else//不存在隔离符就直接返回 { return inString; } } #endregion #region 汉字、英文、纯16进制数、byte[]之间的各种转换方法 /// /// 字符串转换成16进制 /// /// /// /// public string StringTo16(string inSting, Enum16Hex enum16) { string outString = ""; byte[] bytes = Encoding.Default.GetBytes(inSting); for (int i = 0; i < bytes.Length; i++) { int strInt = Convert.ToInt16(bytes[i] - '\0'); string s = strInt.ToString("X"); if (s.Length == 1) { s = "0" + s; } s = s + AddSplitString(enum16); outString += s; } return outString; } /// /// 字符串转换成byte[] /// /// /// public byte[] StringToBtyes(string inSting) { inSting = StringTo16(inSting, Enum16Hex.None);//把字符串转换成16进制数 return From16ToBtyes(inSting);//把16进制数转换成byte[] } /// /// 把16进制字符串转换成byte[] /// /// /// public byte[] From16ToBtyes(string inSting) { inSting = DeleteSplitString(inSting);//去掉16进制中的隔离符 byte[] stringByte = new byte[inSting.Length / 2]; for (int a = 0, b = 0; a < inSting.Length; a = a + 2, b++) { try { string str = inSting.Substring(a, 2); stringByte[b] = (byte)Convert.ToInt16(str, 16); } catch (Exception ex) { throw new Exception("输入的数据不是纯16进制数! 参考错误信息:" + ex.Message); } } return stringByte; } /// /// 把16进制字符串转换成英文数字和汉字混合格式 /// /// 需要转换的16进制字符串 /// public string From16ToString(string inSting) { inSting = DeleteSplitString(inSting); return Encoding.Default.GetString(From16ToBtyes(inSting)); } /// /// 把byte[]转换成String /// /// 需要转换的byte[] /// 隔离符 /// public string BytesToString(byte[] bytes, Enum16Hex enum16) { return From16ToString(BytesTo16(bytes, enum16)); } /// /// byte[]转换成16进制字符串 /// /// 需要转换的byte[] /// /// public string BytesTo16(byte[] bytes, Enum16Hex enum16) { string outString = ""; for (int i = 0; i < bytes.Length; i++) { if (bytes[i].ToString("X").Length < 2)//16进制数为一位时前面填充0 { outString += "0" + bytes[i].ToString("X") + AddSplitString(enum16);//转成16进制数据 } else { outString += bytes[i].ToString("X") + AddSplitString(enum16);//转成16进制数据 } } return outString; } /// /// 把byte[]直接转换成字符串,直接以2进制形式显示出来。 /// /// /// public string BytesTo2String(byte[] bytes, Enum16Hex enum16) { string outString = ""; for (int i = 0; i < bytes.Length; i++) { string tempString = Convert.ToString(bytes[i], 2); if (tempString.Length != 8) { string add0 = ""; for (int j = 0; j < 8 - tempString.Length; j++) { add0 += "0"; } outString += add0 + tempString + AddSplitString(enum16); } else { outString += tempString + AddSplitString(enum16); } } return outString; } /// /// 把字符串传进来,输出一个byte数组【可以把此byte数组直接发送到串口中】 /// /// 要转换的字符串 /// 是否已经是16进制数据,true时已经是(已经转换好的数据),false时不是(需要内部转换) /// 输出一个byte数组 public byte[] StringToBytes(string inString, bool is16) { if (is16) { return From16ToBtyes(inString); } else { return StringToBtyes(inString); } } #endregion } }