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     }
View Code

相关文章:

  • 2021-09-09
  • 2022-01-05
  • 2022-01-26
  • 2021-10-10
  • 2022-12-23
  • 2021-09-12
  • 2021-07-11
  • 2021-09-18
猜你喜欢
  • 2021-12-20
  • 2021-08-07
  • 2021-08-24
  • 2021-06-19
  • 2021-10-21
  • 2022-01-23
相关资源
相似解决方案