using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace ViewModels { public class Tools { /// /// 时间戳转本地时间-时间戳精确到秒 /// public static DateTime ToLocalTimeDateBySeconds(long unix) { var dto = DateTimeOffset.FromUnixTimeSeconds(unix); return dto.ToLocalTime().DateTime; } /// /// 时间转时间戳Unix-时间戳精确到秒 /// public static long ToUnixTimestampBySeconds(DateTime dt) { DateTimeOffset dto = new DateTimeOffset(dt); return dto.ToUnixTimeSeconds(); } /// /// 时间戳转本地时间-时间戳精确到毫秒 /// public static DateTime ToLocalTimeDateByMilliseconds(long unix) { var dto = DateTimeOffset.FromUnixTimeMilliseconds(unix); return dto.ToLocalTime().DateTime; } /// /// 时间转时间戳Unix-时间戳精确到毫秒 /// public static long ToUnixTimestampByMilliseconds(DateTime dt) { DateTimeOffset dto = new DateTimeOffset(dt); return dto.ToUnixTimeMilliseconds(); } /// /// 生成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; } /// /// 字节内容转换为字符串 /// /// /// public static string ByteToString(byte[] bytesData) { StringBuilder result = new StringBuilder(); foreach (byte r in bytesData) { result.Append(r.ToString("X2") + " "); } return result.ToString().Trim(); } /// /// 把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; } /// /// 得到字符串的长度,一个汉字算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; } /// /// 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; } public static string GetCurrentTimeStamp() { TimeSpan ts = DateTime.Now.ToLocalTime() - new DateTime(1970, 1, 1, 8, 0, 0, 0, DateTimeKind.Utc); string current_timestamp = Convert.ToInt64(ts.TotalSeconds).ToString(); return current_timestamp; } /// /// 16进制字符串 转换成 byte 数组 /// /// /// public static byte[] HEXString2ByteArray(string hexString) { char[] hexCharacters = hexString.ToCharArray(); byte[] byteArray = new byte[hexCharacters.Length / 2]; for (int i = 0; i < byteArray.Length; i++) { string hexVal = string.Concat(hexCharacters[i * 2], hexCharacters[i * 2 + 1]); byteArray[i] = Convert.ToByte(hexVal, 16); } return byteArray; } 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; } /// /// AES 加密 /// /// /// /// public static string AesEncrypt(string str, string key) { if (string.IsNullOrEmpty(str)) return null; Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str); System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged { Key = Encoding.UTF8.GetBytes(key), Mode = System.Security.Cryptography.CipherMode.ECB, Padding = System.Security.Cryptography.PaddingMode.PKCS7 }; System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } public static readonly byte[] IV = new byte[] { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; /// /// AES CTR 加密 /// /// /// /// public static byte[] AesEncryptCTR(byte[] str, byte[] key) { //byte[] mySimpleTextAsBytes = System.Text.Encoding.ASCII.GetBytes(str); //byte[] key = new byte[] { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }; // Encrypt AES_CTR forEncrypting = new AES_CTR(key, IV); byte[] encryptedContent = new byte[str.Length]; forEncrypting.EncryptBytes(encryptedContent, str); return encryptedContent; } /// /// AES CRT解密 /// /// /// /// public static byte[] AesDecryptCTR(byte[] encryptedContent, byte[] key) { // Decrypt AES_CTR forDecrypting = new AES_CTR(key, IV); byte[] decryptedContent = new byte[encryptedContent.Length]; forDecrypting.DecryptBytes(decryptedContent, encryptedContent); return decryptedContent; } /// /// AES 解密 /// /// /// /// public static string AesDecrypt(string str, string key) { if (string.IsNullOrEmpty(str)) return null; Byte[] toEncryptArray = Convert.FromBase64String(str); System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged { Key = Encoding.UTF8.GetBytes(key), Mode = System.Security.Cryptography.CipherMode.ECB, Padding = System.Security.Cryptography.PaddingMode.PKCS7 }; System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Encoding.UTF8.GetString(resultArray); } public static string GetMD5(string str) { //创建MD5对象 MD5 mD5 = System.Security.Cryptography.MD5.Create(); byte[] buffer = Encoding.Default.GetBytes(str); var MD5Buffer = mD5.ComputeHash(buffer); //将字节数组转换为字符串 //法一:将字节数组中每个元素按照指定的编码格式解析成字符串 //return Encoding.Default.GetString(MD5Buffer);(会造成乱码) //法二:直接将数组tostring //法三:直接将数组中的每个元素ToString() string s = ""; for (int i = 0; i < MD5Buffer.Length; i++) { s += MD5Buffer[i].ToString("x");//tostring中的参数x是将10进制转化为16进制 } return s; } /// /// IOT 加密 方法 /// /// /// /// /// /// public static byte[] IHIOT_Message_Content_Encrypt(ushort sn, byte[] skey, byte[] data) { byte[] newdata = new byte[data.Length]; Buffer.BlockCopy(data, 0, newdata, 0, newdata.Length); byte key = skey[sn % 16]; int alen = newdata.Length; for (int i = 0; i < alen; i++) { newdata[i] ^= key; // 使用固定密钥字节进行异或加密 } return newdata; } /// /// 解密方法 /// /// /// /// /// /// public byte[] IHIOT_Message_Content_DEncrypt(ushort sn, byte[] skey, byte[] data, ushort alen) { byte[] newdata = new byte[data.Length]; Buffer.BlockCopy(data, 0, newdata, 0, newdata.Length); byte key = skey[sn % 16]; for (int i = 0; i < alen; i++) { newdata[i] ^= key; // 使用固定密钥字节进行异或加密 } return newdata; } } }