using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StressClient { class Helper { // 字符串转16进制字符串 AB-->4142 public static string StrToHexStr(string src, Encoding encode) { byte[] b = encode.GetBytes(src); string result = string.Empty; foreach (var t in b) { result += Convert.ToString(t, 16); } return result; } // 将16进制字符串转换到byte[] public static byte[] HexStrToArrary(string src) { int count = src.Length / 2; byte[] b = new byte[count]; for (int i = 0; i < count; i++) { string val = "0x" + src.Substring(i * 2, 2); b[i] = Convert.ToByte(val, 16); // '0x41'->65 } return b; } public static string do_CRC(byte[] data) { byte check = 0; uint crc = 0xFFFF; for (int idx = 0; idx < data.Length; idx++) { byte pos = data[idx]; crc = (crc >> 8) ^ pos; for (int i = 0; i < 8; i++) { check = (byte)(crc & 0x0001); crc >>= 1; if (check == 0x0001) crc ^= 0xA001; } } //string ret_str = Convert.ToString(crc, 16); string ret_str = crc.ToString("X4"); ; return ret_str.ToUpper(); } public static string do_CRC16(byte[] data) { byte[] returnVal = new byte[2]; byte CRC16Lo, CRC16Hi, CL, CH, SaveHi, SaveLo; int i, Flag; CRC16Lo = 0xFF; CRC16Hi = 0xFF; CL = 0x86; CH = 0x68; for (i = 0; i < data.Length; i++) { CRC16Lo = (byte)(CRC16Lo ^ data[i]);//每一个数据与CRC寄存器进行异或 for (Flag = 0; Flag <= 7; Flag++) { SaveHi = CRC16Hi; SaveLo = CRC16Lo; CRC16Hi = (byte)(CRC16Hi >> 1);//高位右移一位 CRC16Lo = (byte)(CRC16Lo >> 1);//低位右移一位 if ((SaveHi & 0x01) == 0x01)//如果高位字节最后一位为 { CRC16Lo = (byte)(CRC16Lo | 0x80);//则低位字节右移后前面补 否则自动补0 } if ((SaveLo & 0x01) == 0x01)//如果LSB为1,则与多项式码进行异或 { CRC16Hi = (byte)(CRC16Hi ^ CH); CRC16Lo = (byte)(CRC16Lo ^ CL); } } } returnVal[0] = CRC16Hi;//CRC高位 returnVal[1] = CRC16Lo;//CRC低位 return Encoding.UTF8.GetString(returnVal); } private static float GenRandom(int minVal, int maxVal) { Random rdm = new Random(); int val = rdm.Next(minVal, maxVal); return (float)(val / 100.0); } public static string MakeReqStr1(string MN_id, DateTime curTime) { // 时间戳QN , 格式YYYYMMDDhhmmsszzz string ts_str = curTime.ToString("yyyyMMddHHmmssffff"); string QN_val = ts_str.Substring(0, 14); // 分钟填5的倍数,秒填00 int minute = curTime.Minute - curTime.Minute % 5; Object[] param = new Object[] { curTime.Year, curTime.Month, curTime.Day, curTime.Hour, minute, 0 }; string cur_dt = string.Format("{0:D4}{1:D2}{2:D2}{3:D2}{4:D2}{5:D2}", param); // 其他各参数 string ST_val = "80"; string CN_val = "2011"; string PW_val = "123456"; string Flag_val = "5"; string DateTime_val = cur_dt; float S20006_Rtd = GenRandom(200, 500); float S30004_Rtd = GenRandom(3, 9); float S30005_Rtd = GenRandom(100, 300); float S10006_Rtd = GenRandom(200, 600); float S30003_Rtd = GenRandom(100, 500); Object[] param2 = new Object[] { QN_val, ST_val, CN_val, PW_val, MN_id, Flag_val, DateTime_val, S20006_Rtd, S30005_Rtd, S30004_Rtd, S10006_Rtd, S30003_Rtd }; string req_str = string.Format("QN={0};ST={1};CN={2};PW={3};MN={4};Flag={5:G};CP=&&DataTime={6};S20006-Rtd={7};S30005-Rtd={8};S30004-Rtd={9};S10006-Rtd={10};S30003-Rtd={11}", param2); string str = StrToHexStr(req_str, Encoding.Default); byte[] src = Helper.HexStrToArrary(str); string CRC_val = Helper.do_CRC(src); // 数据包总长度 string seg_str = $"##{req_str.Length:D4}"; // 拼装请求 req_str = seg_str + req_str + CRC_val + "\r\n"; return req_str; } } }