1 /// <summary> 2 /// 报文解析转换类 3 /// </summary> 4 public class DatagramConvert 5 { 6 public static Encoding ENCODING_ASCII = Encoding.ASCII; 7 public static Encoding ENCODING_GB2312 = Encoding.GetEncoding("gb2312"); 8 public static Crc16Ccitt CRC16 = new Crc16Ccitt(InitialCrcValue.NonZero1); 9 10 #region 数据转换、解析相关方法 11 /// <summary> 12 /// 解析报文信息,返回完整的报文内容列表 13 /// </summary> 14 /// <param name="datagram"></param> 15 /// <param name="startTag"></param> 16 /// <returns></returns> 17 public static List<string> DatagramParser(ref string datagram, string startTag = "FAF5") 18 { 19 List<string> list = new List<string>(); 20 if (string.IsNullOrWhiteSpace(datagram)) 21 { 22 return list; 23 } 24 int index; 25 while ((index = datagram.IndexOf(startTag)) > -1) 26 { 27 if (datagram.Length <= index + 6) // 判断是否包含长度信息 28 { 29 break; 30 } 31 int len = Convert.ToInt32(datagram.Substring(index + 4, 2), 16) * 2; // 获取数据包长度 32 if (datagram.Length < index + len + 10) // 判断是否包含完整的报文 33 { 34 break; 35 } 36 string newDatagram = datagram.Substring(index, len + 10); // 获取完整的报文 37 list.Add(newDatagram); 38 datagram = datagram.Substring(index + len + 10); // 获取余下的报文信息 39 } 40 41 return list; 42 } 43 44 /// <summary> 45 /// 拆分数据 46 /// </summary> 47 /// <param name="msgs">2位长度的hex字符串数组</param> 48 /// <param name="start">开始索引</param> 49 /// <param name="end">截止位置</param> 50 /// <param name="msgtype"></param> 51 /// <returns></returns> 52 public static object GetString(string[] msgs, int start, int end, string msgtype) 53 { 54 List<byte> msgarry = new List<byte>(); 55 string msg = "0x"; 56 for (int i = start; i <= end; i++) 57 { 58 if (msgtype == "string") 59 { 60 msgarry.Add((byte)Convert.ToInt32(msgs[i], 16)); 61 } 62 else 63 { 64 msg += msgs[i]; 65 } 66 } 67 if (msgtype == "string") 68 { 69 return msgarry; 70 } 71 else 72 { 73 return msg; 74 } 75 } 76 77 /// <summary> 78 /// 向集合中添加批量添加元素 79 /// </summary> 80 /// <param name="bitarry"></param> 81 /// <param name="list"></param> 82 public static void AddRange(string[] bitarry, ref List<string> list) 83 { 84 for (int i = 0; i < bitarry.Length; i++) 85 { 86 list.Add(bitarry[i]); 87 } 88 } 89 90 /// <summary> 91 /// 从字节数组中提取固定长度的元素,提取个数超出数组大小时填充(byte)0 92 /// </summary> 93 /// <param name="bts">字节数组</param> 94 /// <param name="count">提取长度</param> 95 /// <returns></returns> 96 public static byte[] BytesExtract(byte[] bts, int count) 97 { 98 byte[] returnBytes = new byte[count]; 99 for (int i = 0; i < bts.Length && i < count; i++) 100 { 101 returnBytes[i] = bts[i]; 102 } 103 if (bts.Length < count) 104 { 105 for (int i = bts.Length; i < count; i++) 106 { 107 returnBytes[i] = Convert.ToByte(0); 108 } 109 } 110 return returnBytes; 111 } 112 113 /// <summary> 114 /// 将字节数组转换为制定长度的16位字符串数组 115 /// </summary> 116 /// <param name="bts">字节数组</param> 117 /// <param name="count">返回字符串长度</param> 118 /// <returns></returns> 119 public static string[] BytesToHexArray(byte[] bts, int count) 120 { 121 string[] returnBytes = new string[count]; 122 for (int i = 0; i < bts.Length; i++) 123 { 124 returnBytes[i] = Convert10To16(bts[i]).ToUpper(); 125 } 126 if (bts.Length < count) 127 { 128 for (int i = bts.Length; i < count; i++) 129 { 130 returnBytes[i] = "00"; 131 } 132 } 133 return returnBytes; 134 } 135 136 /// <summary> 137 /// 16进制字符串按2个长度分割成字节数组 138 /// </summary> 139 /// <param name="hexString"></param> 140 /// <returns></returns> 141 public static byte[] HexStringToBytes(string hexString) 142 { 143 hexString = hexString.Replace(" ", ""); 144 if ((hexString.Length % 2) != 0) 145 hexString += " "; 146 byte[] returnBytes = new byte[hexString.Length / 2]; 147 for (int i = 0; i < returnBytes.Length; i++) 148 returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); 149 return returnBytes; 150 } 151 152 /// <summary> 153 /// 将16进制字符串按2个长度进行分割 154 /// </summary> 155 /// <param name="hexString">16进制字符串</param> 156 /// <returns></returns> 157 public static string[] HexStringToArray(string hexString) 158 { 159 hexString = hexString.Replace(" ", ""); 160 if ((hexString.Length % 2) != 0) 161 hexString += " "; 162 string[] returnBytes = new string[hexString.Length / 2]; 163 for (int i = 0; i < returnBytes.Length; i++) 164 returnBytes[i] = hexString.Substring(i * 2, 2); 165 return returnBytes; 166 } 167 168 /// <summary> 169 /// 十进制转十六进制 170 /// </summary> 171 /// <param name="value"></param> 172 /// <returns></returns> 173 public static string Convert10To16(int value) 174 { 175 return Convert.ToString(value, 16); 176 } 177 178 /// <summary> 179 /// 十进制转十六进制 180 /// </summary> 181 /// <param name="value"></param> 182 /// <returns></returns> 183 public static string Convert10To16(long value) 184 { 185 return Convert.ToString(value, 16); 186 } 187 188 /// <summary> 189 /// 十进制转十六进制 190 /// </summary> 191 /// <param name="value"></param> 192 /// <returns></returns> 193 public static int Convert10To16(string value) 194 { 195 return Convert.ToInt32(value, 16); 196 } 197 198 /// <summary> 199 /// 十进制转十六进制 200 /// </summary> 201 /// <param name="value"></param> 202 /// <returns></returns> 203 public static int Convert16To10(string value) 204 { 205 return Convert.ToInt32(value, 16); 206 } 207 208 /// <summary> 209 /// 数据类型转换示例 210 /// </summary> 211 private static void DataConvertDemo() 212 { 213 //十进制转二进制 214 215 Console.WriteLine(Convert.ToString(69, 2)); 216 217 //十进制转八进制 218 219 Console.WriteLine(Convert.ToString(69, 8)); 220 221 //十进制转十六进制 222 223 Console.WriteLine(Convert.ToString(69, 16)); 224 225 //二进制转十进制 226 227 Console.WriteLine(Convert.ToInt32("100111101", 2)); 228 229 //八进制转十进制 230 231 Console.WriteLine(Convert.ToInt32("76", 8)); 232 233 //C# 16进制转换10进制 234 235 Console.WriteLine(Convert.ToInt32("FF", 16)); 236 237 } 238 239 /// <summary> 240 /// CRC异或校验 241 /// </summary> 242 /// <param name="cmdString">命令字符串</param> 243 /// <returns></returns> 244 public static string CRC(string cmdString) 245 { 246 try 247 { 248 //CRC寄存器 249 int CRCCode = 0; 250 // 将字符串拆分成为16进制字节数据然后两位两位进行异或校验 251 for (int i = 1; i < cmdString.Length / 2; i++) 252 { 253 string cmdHex = cmdString.Substring(i * 2, 2); 254 if (i == 1) 255 { 256 string cmdPrvHex = cmdString.Substring((i - 1) * 2, 2); 257 CRCCode = (byte)Convert.ToInt32(cmdPrvHex, 16) ^ (byte)Convert.ToInt32(cmdHex, 16); 258 } 259 else 260 { 261 CRCCode = (byte)CRCCode ^ (byte)Convert.ToInt32(cmdHex, 16); 262 } 263 } 264 return CRCCode.ToString("X2");// 返回16进制校验码 265 } 266 catch 267 { 268 return "00"; 269 } 270 } 271 #endregion 272 }
相关文章: