CNAS取数仪器端升级
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

290 lines
9.4KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace CNAS_SerialPort
  7. {
  8. /// <summary>
  9. /// 16进制使用的隔离符枚举
  10. /// </summary>
  11. public enum Enum16Hex
  12. {
  13. None,//无
  14. Blank,//空格
  15. OX, //OX
  16. Ox //Ox
  17. }
  18. /// <summary>
  19. /// 计算进制类助手
  20. /// </summary>
  21. public class AlgorithmHelper
  22. {
  23. #region 十进制转十六进制
  24. public string From10To16(int d)
  25. {
  26. string hex = "";
  27. if (d < 16)
  28. {
  29. hex = BeginChange(d);
  30. }
  31. else
  32. {
  33. int c;
  34. int s = 0;
  35. int n = d;
  36. int temp = d;
  37. while (n >= 16)
  38. {
  39. s++;
  40. n = n / 16;
  41. }
  42. string[] m = new string[s];
  43. int i = 0;
  44. do
  45. {
  46. c = d / 16;
  47. m[i++] = BeginChange(d % 16);//判断是否大于10,如果大于10,则转换为A~F的格式
  48. d = c;
  49. } while (c >= 16);
  50. hex = BeginChange(d);
  51. for (int j = m.Length - 1; j >= 0; j--)
  52. {
  53. hex += m[j];
  54. }
  55. }
  56. return hex;
  57. }
  58. //判断是否为10~15之间的数,如果是则进行转换
  59. public string BeginChange(int d)
  60. {
  61. string hex = "";
  62. switch (d)
  63. {
  64. case 10:
  65. hex = "A";
  66. break;
  67. case 11:
  68. hex = "B";
  69. break;
  70. case 12:
  71. hex = "C";
  72. break;
  73. case 13:
  74. hex = "D";
  75. break;
  76. case 14:
  77. hex = "E";
  78. break;
  79. case 15:
  80. hex = "F";
  81. break;
  82. default:
  83. hex = d.ToString();
  84. break;
  85. }
  86. return hex;
  87. }
  88. #endregion
  89. #region 其他函数【16进制中的隔离符处理】
  90. /// <summary>
  91. /// 把16进制隔离符转换成实际的字符串
  92. /// </summary>
  93. /// <param name="enum16">16进制隔离符枚举</param>
  94. /// <returns></returns>
  95. private string AddSplitString(Enum16Hex enum16)
  96. {
  97. switch (enum16)
  98. {
  99. case Enum16Hex.None:
  100. return "";
  101. case Enum16Hex.Ox:
  102. return "0x";
  103. case Enum16Hex.OX:
  104. return "0X";
  105. case Enum16Hex.Blank:
  106. return " ";
  107. default:
  108. return "";
  109. }
  110. }
  111. /// <summary>
  112. /// 去掉16进制字符串中的隔离符【 如:" ", "0x", "0X"】
  113. /// </summary>
  114. /// <param name="inString">需要转换的字符串数据</param>
  115. /// <returns></returns>
  116. private string DeleteSplitString(string inString)
  117. {
  118. string outString = string.Empty;
  119. string[] delArray = { " ", "0x", "0X" };
  120. if (inString.Contains(" ") || inString.Contains("0x") || inString.Contains("0X"))//存在隔离符
  121. {
  122. string[] str = inString.Split(delArray,
  123. System.StringSplitOptions.RemoveEmptyEntries);//以隔离符进行转换数组,去掉隔离符,去掉空格。
  124. for (int i = 0; i < str.Length; i++)
  125. {
  126. outString += str[i].ToString();
  127. }
  128. return outString;
  129. }
  130. else//不存在隔离符就直接返回
  131. {
  132. return inString;
  133. }
  134. }
  135. #endregion
  136. #region 汉字、英文、纯16进制数、byte[]之间的各种转换方法
  137. /// <summary>
  138. /// 字符串转换成16进制
  139. /// </summary>
  140. /// <param name="inSting"></param>
  141. /// <param name="enum16"></param>
  142. /// <returns></returns>
  143. public string StringTo16(string inSting, Enum16Hex enum16)
  144. {
  145. string outString = "";
  146. byte[] bytes = Encoding.Default.GetBytes(inSting);
  147. for (int i = 0; i < bytes.Length; i++)
  148. {
  149. int strInt = Convert.ToInt16(bytes[i] - '\0');
  150. string s = strInt.ToString("X");
  151. if (s.Length == 1)
  152. {
  153. s = "0" + s;
  154. }
  155. s = s + AddSplitString(enum16);
  156. outString += s;
  157. }
  158. return outString;
  159. }
  160. /// <summary>
  161. /// 字符串转换成byte[]
  162. /// </summary>
  163. /// <param name="inSting"></param>
  164. /// <returns></returns>
  165. public byte[] StringToBtyes(string inSting)
  166. {
  167. inSting = StringTo16(inSting, Enum16Hex.None);//把字符串转换成16进制数
  168. return From16ToBtyes(inSting);//把16进制数转换成byte[]
  169. }
  170. /// <summary>
  171. /// 把16进制字符串转换成byte[]
  172. /// </summary>
  173. /// <param name="inSting"></param>
  174. /// <returns></returns>
  175. public byte[] From16ToBtyes(string inSting)
  176. {
  177. inSting = DeleteSplitString(inSting);//去掉16进制中的隔离符
  178. byte[] stringByte = new byte[inSting.Length / 2];
  179. for (int a = 0, b = 0; a < inSting.Length; a = a + 2, b++)
  180. {
  181. try
  182. {
  183. string str = inSting.Substring(a, 2);
  184. stringByte[b] = (byte)Convert.ToInt16(str, 16);
  185. }
  186. catch (Exception ex)
  187. {
  188. throw new Exception("输入的数据不是纯16进制数! 参考错误信息:" + ex.Message);
  189. }
  190. }
  191. return stringByte;
  192. }
  193. /// <summary>
  194. /// 把16进制字符串转换成英文数字和汉字混合格式
  195. /// </summary>
  196. /// <param name="inSting">需要转换的16进制字符串</param>
  197. /// <returns></returns>
  198. public string From16ToString(string inSting)
  199. {
  200. inSting = DeleteSplitString(inSting);
  201. return Encoding.Default.GetString(From16ToBtyes(inSting));
  202. }
  203. /// <summary>
  204. /// 把byte[]转换成String
  205. /// </summary>
  206. /// <param name="bytes">需要转换的byte[]</param>
  207. /// <param name="enum16">隔离符</param>
  208. /// <returns></returns>
  209. public string BytesToString(byte[] bytes, Enum16Hex enum16)
  210. {
  211. return From16ToString(BytesTo16(bytes, enum16));
  212. }
  213. /// <summary>
  214. /// byte[]转换成16进制字符串
  215. /// </summary>
  216. /// <param name="bytes">需要转换的byte[]</param>
  217. /// <param name="enum16"></param>
  218. /// <returns></returns>
  219. public string BytesTo16(byte[] bytes, Enum16Hex enum16)
  220. {
  221. string outString = "";
  222. for (int i = 0; i < bytes.Length; i++)
  223. {
  224. if (bytes[i].ToString("X").Length < 2)//16进制数为一位时前面填充0
  225. {
  226. outString += "0" + bytes[i].ToString("X") + AddSplitString(enum16);//转成16进制数据
  227. }
  228. else
  229. {
  230. outString += bytes[i].ToString("X") + AddSplitString(enum16);//转成16进制数据
  231. }
  232. }
  233. return outString;
  234. }
  235. /// <summary>
  236. /// 把byte[]直接转换成字符串,直接以2进制形式显示出来。
  237. /// </summary>
  238. /// <param name="bytes"></param>
  239. /// <returns></returns>
  240. public string BytesTo2String(byte[] bytes, Enum16Hex enum16)
  241. {
  242. string outString = "";
  243. for (int i = 0; i < bytes.Length; i++)
  244. {
  245. string tempString = Convert.ToString(bytes[i], 2);
  246. if (tempString.Length != 8)
  247. {
  248. string add0 = "";
  249. for (int j = 0; j < 8 - tempString.Length; j++)
  250. {
  251. add0 += "0";
  252. }
  253. outString += add0 + tempString + AddSplitString(enum16);
  254. }
  255. else
  256. {
  257. outString += tempString + AddSplitString(enum16);
  258. }
  259. }
  260. return outString;
  261. }
  262. /// <summary>
  263. /// 把字符串传进来,输出一个byte数组【可以把此byte数组直接发送到串口中】
  264. /// </summary>
  265. /// <param name="inString">要转换的字符串</param>
  266. /// <param name="is16">是否已经是16进制数据,true时已经是(已经转换好的数据),false时不是(需要内部转换)</param>
  267. /// <returns>输出一个byte数组</returns>
  268. public byte[] StringToBytes(string inString, bool is16)
  269. {
  270. if (is16)
  271. {
  272. return From16ToBtyes(inString);
  273. }
  274. else
  275. {
  276. return StringToBtyes(inString);
  277. }
  278. }
  279. #endregion
  280. }
  281. }