using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Text; using System.Security.Cryptography; using System.Web; using System.ComponentModel; using System.Text.RegularExpressions; namespace CommonTools { public static class Tools { /// /// 获取本地IP地址 /// /// public static string GetLocalIP() { string localIp = ""; IPAddress[] addressList = Dns.GetHostAddresses(Dns.GetHostName());//会返回所有地址,包括IPv4和IPv6 foreach (IPAddress ip in addressList) { if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { localIp = ip.ToString(); break; } } return localIp; } /// /// 将主机名或 IP 地址解析IP地址 /// /// /// public static IPAddress GetIPByDomain(string hostNameOrAddress) { IPHostEntry host = Dns.GetHostEntry(hostNameOrAddress); return host.AddressList[0]; } /// /// 获取本地IP地址列表 /// /// public static IList GetLocalIPList() { IList localIpList = new List(); IPAddress[] addressList = Dns.GetHostAddresses(Dns.GetHostName());//会返回所有地址,包括IPv4和IPv6 foreach (IPAddress ip in addressList) { if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { localIpList.Add(ip.ToString()); } } return localIpList; } public static string GetApplicationPath() { return AppDomain.CurrentDomain.SetupInformation.ApplicationBase; } /// /// 获取记录访问量文件路径 /// /// public static string GetCounterFilePath() { return GetApplicationPath() + @"License\counter.txt"; } /// /// 生成CRC16校验 /// /// /// /// public static ushort CRC16(byte[] buffer, int len) { uint xda, xdapoly; byte xdabit; xda = 0xFFFF; xdapoly = 0xA001; // (X**16 + X**15 + X**2 + 1) for (int i = 0; i < len; i++) { xda ^= buffer[i]; for (int j = 0; j < 8; j++) { xdabit = (byte)(xda & 0x01); xda >>= 1; if (xdabit == 1) { xda ^= xdapoly; } } } return Convert.ToUInt16(xda & 0xffff); } /// /// 计算文件的MD5值 /// /// /// public static byte[] MD5(string file) { using (Stream stream = File.Open(file, FileMode.Open)) { return MD5(stream); } } /// /// 计算流的MD5值 /// /// /// public static byte[] MD5(Stream stream) { using (MD5 md5 = new MD5CryptoServiceProvider()) { return md5.ComputeHash(stream); } } /// /// 计算文件MD5 /// /// /// public static string ComputeFileHash(Stream stream) { byte[] retVal = Tools.MD5(stream); StringBuilder sb = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } return sb.ToString(); } /// /// 将MD5字符串转换成整型数组表示 /// /// /// public static uint[] MD5StringToUIntArray(string md5) { if (String.IsNullOrWhiteSpace(md5)) { throw new ArgumentException("参数不能为空。", "md5"); } try { uint[] md5Arr = new uint[4] { 0, 0, 0, 0 }; md5Arr[0] = Convert.ToUInt32(md5.Substring(0, 8), 16); md5Arr[1] = Convert.ToUInt32(md5.Substring(8, 8), 16); md5Arr[2] = Convert.ToUInt32(md5.Substring(16, 8), 16); md5Arr[3] = Convert.ToUInt32(md5.Substring(24, 8), 16); return md5Arr; } catch (Exception ex) { throw new ApplicationException("转换MD5出错。", ex); } } /// /// 用MD5加密字符串 /// /// 待加密的字符串 /// public static string MD5Encrypt(string str) { MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); byte[] hashedDataBytes; hashedDataBytes = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(str)); StringBuilder tmp = new StringBuilder(); foreach (byte i in hashedDataBytes) { tmp.Append(i.ToString("x2")); } return tmp.ToString(); } /// /// 获取指定长的的字符串对应的16进制字节码,如果长度不够,末位自动补0 /// /// /// /// public static byte[] GetBytes(String str, int length) { byte[] s = System.Text.Encoding.GetEncoding("gb2312").GetBytes(str); int fixLength = length - s.Length; if (s.Length < length) { byte[] S_bytes = new byte[length]; Array.Copy(s, 0, S_bytes, 0, s.Length); for (int x = length - fixLength; x < length; x++) { S_bytes[x] = 0x00; } return S_bytes; } return s; } /// /// 获取一个随机数组 /// /// 数组个数 /// /// /// public static int[] GetRandomNum(int num, int minValue, int maxValue) { Random ra = new Random(unchecked((int)DateTime.Now.Ticks)); int[] arrNum = new int[num]; int tmp = 0; for (int i = 0; i <= num - 1; i++) { tmp = ra.Next(minValue, maxValue); //随机取数 arrNum[i] = tmp; } return arrNum; } /// /// 解决下载名称在IE下中文乱码 /// /// /// public static String ToUtf8String(String s) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.Length; i++) { char c = s[i]; if (c >= 0 && c <= 255) { sb.Append(c); } else { byte[] b; try { b = Encoding.UTF8.GetBytes(c.ToString()); } catch (Exception) { b = new byte[0]; } for (int j = 0; j < b.Length; j++) { int k = b[j]; if (k < 0) k += 256; sb.Append("%" + Convert.ToString(k, 16).ToUpper()); } } } return sb.ToString(); } /// /// 字节内容转换为字符串 /// /// /// public static string ByteToString(byte[] bytesData) { StringBuilder result = new StringBuilder(); foreach (byte r in bytesData) { result.Append(r.ToString("X2") + " "); } return result.ToString(); } /// /// 把int32类型的数据转存到2个字节的byte数组中 /// /// int32类型的数据 /// 2个字节大小的byte数组 /// public static byte[] Int32ToByte(Int32 data) { byte[] arry = new byte[2]; arry[0] = (byte)((data & 0xFF00) >> 8); arry[1] = (byte)(data & 0xFF); return arry; } /// /// 把int32类型的数据转存到2个字节的byte数组中:小端 /// /// /// public static byte[] Int32ToByte2(Int32 data) { byte[] arry = new byte[2]; arry[0] = (byte)(data & 0xFF); arry[1] = (byte)((data & 0xFF00) >> 8); //arry[2] = (byte)((data & 0xFF0000) >> 16); //arry[3] = (byte)((data >> 24) & 0xFF); return arry; } /// /// 2位byte转换为int类型 /// /// /// public static int ByteToInt(byte[] data) { return (data[1] & 0xFF) << 8 | data[0]; } /// /// 4位byte转换为long类型 /// /// /// public static long Byte4ToLong(byte[] data) { return (data[3] << 24) & 0xFF | (data[2] & 0xFF00) << 16 | (data[1] & 0xFF) << 8 | data[0]; } /// /// long类型转换为4位byte /// /// /// public static byte[] LongToByte4(long data) { byte[] arry = new byte[4]; arry[0] = (byte)(data & 0xFF); arry[1] = (byte)((data & 0xFF00) >> 8); arry[2] = (byte)((data & 0xFF0000) >> 16); arry[3] = (byte)((data >> 24) & 0xFF); return arry; } /// /// 在指定时间过后执行指定的表达式 /// /// 事件之间经过的时间(以毫秒为单位) /// 要执行的表达式 public static void SetTimeout(double interval, Action action) { System.Timers.Timer timer = new System.Timers.Timer(interval); timer.Elapsed += delegate (object sender, System.Timers.ElapsedEventArgs e) { timer.Enabled = false; action(); }; timer.Enabled = true; } /// /// 得到字符串的长度,一个汉字算2个字符 /// /// 字符串 /// 返回字符串长度 public static int GetLength(string str) { if (str.Length == 0) return 0; ASCIIEncoding ascii = new ASCIIEncoding(); int tempLen = 0; byte[] s = ascii.GetBytes(str); for (int i = 0; i < s.Length; i++) { if ((int)s[i] == 63) { tempLen += 2; } else { tempLen += 1; } } return tempLen; } /// /// 获取枚举描述 /// /// 枚举 /// 返回枚举的描述 public static string GetDescription(Enum en) { Type type = en.GetType();//获取类型 MemberInfo[] memberInfos = type.GetMember(en.ToString()); //获取成员 if (memberInfos != null && memberInfos.Length > 0) { DescriptionAttribute[] attrs = memberInfos[0].GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[]; //获取描述特性 if (attrs != null && attrs.Length > 0) { return attrs[0].Description; //返回当前描述 } } return en.ToString(); } /// /// stream to reader /// /// /// public static string StreamToString(Stream stream) { stream.Position = 0; using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { return reader.ReadToEnd(); } } /// /// HEX编码转换为——>ASCII编码 /// /// /// public static string HexToASCII(string Msg) { byte[] buff = new byte[Msg.Length / 2]; string Message = ""; for (int i = 0; i < buff.Length; i++) { buff[i] = byte.Parse(Msg.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); } System.Text.Encoding chs = System.Text.Encoding.ASCII; Message = chs.GetString(buff); return Message; } /// /// HEX编码转换为——>字符串 /// /// /// public static string HexToStr(string Msg) { byte[] buff = new byte[Msg.Length / 2]; string Message = ""; for (int i = 0; i < buff.Length; i++) { buff[i] = byte.Parse(Msg.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); } System.Text.Encoding chs = System.Text.Encoding.GetEncoding("gb2312"); Message = chs.GetString(buff); return Message; } /// /// 字符串转化为——>HEX编码 /// /// /// public static string StrToHex(string Msg) { byte[] bytes = System.Text.Encoding.Default.GetBytes(Msg);//转换为字节(十进制) string str = ""; for (int i = 0; i < bytes.Length; i++) { str += string.Format("{0:X}", bytes[i]); //转换为十六进制 } return str; } /// /// Hex文件解释 /// /// public static void HexFileRead(string filepath)//从指定文件目录读取HEX文件并解析,放入缓存数组buffer中 { string szLine; int startAdr; int endAdr = 0; //用于判断hex地址是否连续,不连续补充0xFF byte[] buffer = new byte[1024 * 1024 * 5]; // 打开文件hex to bin缓存 int bufferAdr = 0;// 打开文件hex to bin缓存指针,用于计算bin的长度 if (filepath == "") { return; } FileStream fsRead = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Read); StreamReader HexReader = new StreamReader(fsRead); //读取数据流 while (true) { szLine = HexReader.ReadLine(); //读取Hex中一行 if (szLine == null) { break; } //读取完毕,退出 if (szLine.Substring(0, 1) == ":") //判断首字符是”:” { if (szLine.Substring(1, 8) == "00000001") { break; } //文件结束标识 if ((szLine.Substring(8, 1) == "0") || (szLine.Substring(8, 1) == "1"))//直接解析数据类型标识为 : 00 和 01 的格式 { int lineLenth; string hexString; hexString = szLine.Substring(1, 2); lineLenth = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber); // 获取一行的数据个数值 hexString = szLine.Substring(3, 4); startAdr = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber); // 获取地址值 for (int i = 0; i < startAdr - endAdr; i++) // 补空位置 { hexString = "FF"; byte value = byte.Parse(hexString, System.Globalization.NumberStyles.HexNumber); buffer[bufferAdr] = value; bufferAdr++; } for (int i = 0; i < lineLenth; i++) // hex转换为byte { hexString = szLine.Substring(i * 2 + 9, 2); byte value = byte.Parse(hexString, System.Globalization.NumberStyles.HexNumber); buffer[bufferAdr] = value; bufferAdr++; } endAdr = startAdr + lineLenth; } } } } /// /// 将url参数转成json /// /// /// public static string UrlParamsToJson(string urlParams) { var nameValueCollection = HttpUtility.ParseQueryString(urlParams); var json = Newtonsoft.Json.JsonConvert.SerializeObject(nameValueCollection.AllKeys.ToDictionary(k => k, k => nameValueCollection[k])); return json; } //public static string GetUrl(string url) //{ // ComputeSignature(); // return "http://"+ url + "/?" + // string.Join("&", _parameters.Select(x => x.Key + "=" + HttpUtility.UrlEncode(x.Value))); //} public static long GetCurrentTimeStamp(DateTime dt) { TimeSpan ts = dt - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Local); long current_timestamp = Convert.ToInt64(ts.TotalSeconds); return current_timestamp; } public static DateTime GetCurrentDateTime(long timestampMilliseconds) { DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local); DateTime utcTime = epoch.AddSeconds(timestampMilliseconds); return utcTime; } /// /// 格林尼治时间 /// /// public static long GetUnixTime() { DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); long unixTimestampMillisecondsManual = (long)(DateTime.UtcNow - unixEpoch).TotalSeconds; return unixTimestampMillisecondsManual; } public static DateTime GetTimeFromUnixTime(long timestampSeconds) { // Unix 时间戳的起始时间(1970-01-01 00:00:00 UTC) DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); // 加上 Unix 时间戳的秒数 return unixEpoch.AddSeconds(timestampSeconds); } public static byte CombineBitsToByte(bool bit0, bool bit1, bool bit2, bool bit3) { byte result = (byte)((bit0 ? 1 : 0) << 3); // 将bit0移到第4位(高位) result |= (byte)((bit1 ? 1 : 0) << 2); // 将bit1移到第3位 result |= (byte)((bit2 ? 1 : 0) << 1); // 将bit2移到第2位 result |= (byte)(bit3 ? 1 : 0); // 将bit3移到第1位(低位) return result; } /// /// 16进制字符串转换成 字节数组 /// /// /// public static byte[] GetBytesFromString(string hexString) { hexString = DeleteSpaceChar(hexString); byte[] bytes = new byte[hexString.Length / 2]; // 计算字节数组的长度 for (int i = 0; i < bytes.Length; i++) { bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); // 每次取两个字符转换为字节 } return bytes; } public static string DeleteSpaceChar(string originalString) { string result = Regex.Replace(originalString, @"\s", ""); return result; } public static short HostNumberToHotelCode(string wer) { var v1 = wer.Substring(0, 3); var v2 = wer.Substring(3, 3); byte b12 = byte.Parse(v1); byte b13 = byte.Parse(v2); byte[] vva1 = new byte[] { b12, b13 }; var usa = BitConverter.ToInt16(vva1, 0); return usa; } } }