namespace Ticket.Common
{
using System;
using System.Configuration;
using System.Drawing;
using System.Drawing.Imaging;
using System.Globalization;
using System.IO;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// 系统信息类
/// </summary>
public class Sys
{
private static string _appPath = "";
/// <summary>
/// 生成验证码图片
/// </summary>
/// <param name="checkCode"></param>
public static void CreateImage(string checkCode)
{
int width = (int)(checkCode.Length * 17.5);
Bitmap image = new Bitmap(width, 25);
Graphics graphics = Graphics.FromImage(image);
Font font = new Font("Arial", 14, FontStyle.Bold);
Brush brush = new SolidBrush(Color.FromArgb(0, 0, 0));
graphics.Clear(Color.FromArgb(0xdb, 0xdb, 0xdb));
graphics.DrawString(checkCode, font, brush, (float)3f, (float)3f);
//线条颜色
Pen pen = new Pen(Color.SlateGray, 0f);
Random random = new Random();
for (int i = 0; i < 2; i++)
{
int num3 = random.Next(image.Height);
graphics.DrawEllipse(pen, 2, num3, image.Width, num3);
}
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg);
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ContentType = "image/jpeg";
HttpContext.Current.Response.BinaryWrite(stream.ToArray());
stream.Close();
graphics.Dispose();
image.Dispose();
}
/// <summary>
/// 生成随机码
/// </summary>
/// <param name="codeCount">代码位数</param>
/// <returns>字符串</returns>
public static string CreateRandomCode(int codeCount)
{
//,a,b,c,d,e,f,g,h,i,j,k,k,m,n,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,J,K,L,M,N,P,P,Q,R,S,T,U,W,X,Y,Z
string[] strArray = "0,1,2,3,4,5,6,7,8,9".Split(new char[] { ',' });
string str2 = "";
int num = -1;
Random random = new Random();
for (int i = 0; i < codeCount; i++)
{
if (num != -1)
{
random = new Random((i * num) * ((int)DateTime.Now.Ticks));
}
int index = random.Next(10);
if (num == index)
{
return CreateRandomCode(codeCount);
}
num = index;
str2 = str2 + strArray[index];
}
return str2;
}
/// <summary>
/// 进行DES加密。
/// </summary>
/// <param name="pToEncrypt">要加密的字符串。</param>
/// <param name="sKey">密钥,且必须为8位。</param>
/// <returns>以Base64格式返回的加密字符串。</returns>
public static string Encrypt(string encryptData, string sKey)
{
//string str = "";
//if (!string.IsNullOrEmpty(encryptData))
//{
// using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
// {
// byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptData);
// des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
// des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
// System.IO.MemoryStream ms = new System.IO.MemoryStream();
// using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
// {
// cs.Write(inputByteArray, 0, inputByteArray.Length);
// cs.FlushFinalBlock();
// cs.Close();
// }
// str = Convert.ToBase64String(ms.ToArray());
// ms.Close();
// }
//}
//return str
PasswordDeriveBytes pd = new PasswordDeriveBytes(sKey, null);
byte[] deskey = pd.GetBytes(24);//3DES Key为24位
byte[] desiv = pd.GetBytes(8);//3DES Key为8位
byte[] data = Encoding.GetEncoding("GB2312").GetBytes(encryptData);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.IV = desiv;
des.Key = deskey;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.Zeros;
ICryptoTransform desdecrypt = des.CreateEncryptor();
byte[] chipcolk = desdecrypt.TransformFinalBlock(data, 0, data.Length);
return Convert.ToBase64String(chipcolk);// Encoding.Default.GetString(chipcolk);
}
/// <summary>
/// 进行DES解密。
/// </summary>
/// <param name="descryptData">要解密的以Base64</param>
/// <param name="sKey">密钥,且必须为8位。</param>
/// <returns>已解密的字符串。</returns>
public static string Decrypt(string descryptData, string sKey)
{
//string str = "";
//if (!string.IsNullOrEmpty(descryptData))
//{
// byte[] inputByteArray = Convert.FromBase64String(descryptData);
// using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
// {
// des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
// des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
// System.IO.MemoryStream ms = new System.IO.MemoryStream();
// using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
// {
// cs.Write(inputByteArray, 0, inputByteArray.Length);
// cs.FlushFinalBlock();
// cs.Close();
// }
// str = Encoding.UTF8.GetString(ms.ToArray());
// ms.Close();
// }
//}
//return str;
PasswordDeriveBytes pd = new PasswordDeriveBytes(sKey, null);
byte[] deskey = pd.GetBytes(24);//3DES Key为24位
byte[] desiv = pd.GetBytes(8);//3DES Key为8位
byte[] data = Convert.FromBase64String(descryptData);// Encoding.Default.GetBytes(chipertext);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.IV = desiv;
des.Key = deskey;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.Zeros;
ICryptoTransform desdecrypt = des.CreateDecryptor();
byte[] chipcolk = desdecrypt.TransformFinalBlock(data, 0, data.Length);
string strSource = Encoding.GetEncoding("GB2312").GetString(chipcolk);
return strSource.Replace("/0", "");
}
/// <summary>
/// 打印输出
/// </summary>
public static void Write(object obj)
{
HttpContext.Current.Response.Write(obj);
}
/// <summary>
/// Url编码
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string UrlEncode(string s)
{
return HttpContext.Current.Server.UrlEncode(s);
}
/// <summary>
/// Url解码
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string UrlDecode(string s)
{
return HttpContext.Current.Server.UrlDecode(s);
}
/// <summary>
/// 终止执行
/// </summary>
public static void End()
{
HttpContext.Current.Response.End();
}
/// <summary>
/// 格式化数值小数点位数
/// </summary>
/// <param name="NumberDigits">位数</param>
/// <returns></returns>
public static NumberFormatInfo FormatToFixed(int NumberDigits)
{
NumberFormatInfo numberFormat = new CultureInfo("zh-cn", false).NumberFormat;
numberFormat.NumberDecimalDigits = NumberDigits;
return numberFormat;
}
/// <summary>
/// 转换成ASCII码
/// </summary>
/// <param name="obj">转换对象</param>
/// <returns></returns>
public static int GetCharToAsc(object obj)
{
return (short)Convert.ToChar(obj);
}
/// <summary>
/// 根据路径地址获取文件名
/// </summary>
/// <param name="path">路径地址</param>
/// <returns></returns>
public static string GetFileName(string path)
{
string str = path;
int startIndex = str.LastIndexOf(@"/") + 1;
return str.Substring(startIndex);
}
/// <summary>
/// Ascii码转字符
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static char GetNumToAsc(int obj)
{
return Convert.ToChar(obj);
}
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string GetRegTxt(string obj)
{
string str = obj;
if (str != null)
{
str = obj.Replace("'", "’");
}
return str;
}
/// <summary>
/// 获取随机数
/// </summary>
/// <returns></returns>
public static string GetRndNumber()
{
string sDateTime = DateTime.Now.ToString("yyyymmddhhmmssFFF");
Random random = new Random();
return (sDateTime + Convert.ToInt64((double)(random.NextDouble() * 10000000)));
}
/// <summary>
/// Html解码
/// </summary>
/// <param name="strHtml"></param>
/// <returns></returns>
public static string HtmlDecode(string strHtml)
{
string s = strHtml;
return HttpContext.Current.Server.HtmlDecode(s).Replace("/&/g", "&").Replace("/"/g", "/"").Replace("/</g", "<").Replace("/>/g", ">").Replace("/'/g", "'").Replace("/ /g", @"/ ").Replace("//n/g", "<br>").Replace("//t/g", " ");
}
/// <summary>
/// 是否为小数
/// </summary>
/// <param name="theNum"></param>
/// <returns></returns>
public static bool IsDigit(object theNum)
{
string str = "0123456789";
if (IsEmpty(theNum))
{
return false;
}
if (str.IndexOf(theNum.ToString()) == -1)
{
return false;
}
return true;
}
/// <summary>
/// 是否为空
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsEmpty(object str)
{
string str2 = str.ToString();
if ((str != null) && (str2.Length != 0))
{
return false;
}
return true;
}
/// <summary>
/// 是否为整数
/// </summary>
/// <param name="theStr"></param>
/// <returns></returns>
public static bool IsInt(object theStr)
{
if (IsEmpty(theStr))
{
return false;
}
string str = theStr.ToString();
for (int i = 0; i < str.Length; i++)
{
if (!IsDigit(str.Substring(i, i + 1)))
{
return false;
}
}
return true;
}
/// <summary>
/// 是否为数值
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsNumber(object str)
{
if (str != null)
{
Regex regex = new Regex(@"^[-]?/d+[.]?/d*$");
return regex.IsMatch(str.ToString());
}
return false;
}
/// <summary>
/// 打印输出
/// </summary>
/// <param name="obj"></param>
public static void Out(object obj)
{
HttpContext.Current.Response.Write(obj);
}
/// <summary>
/// 获取当前应用程序路径
/// </summary>
public static string ApplicationPath
{
get
{
_appPath = HttpContext.Current.Request.ApplicationPath;
if (!(_appPath == "/"))
{
return _appPath;
}
return "";
}
}
/// <summary>
/// 获取当前文件名
/// </summary>
public static string FileName
{
get
{
string filePath = HttpContext.Current.Request.FilePath;
int startIndex = filePath.LastIndexOf("/") + 1;
int length = filePath.LastIndexOf(".") - startIndex;
return filePath.Substring(startIndex, length);
}
}
/// <summary>
/// 根据 User Agent 获取操作系统名称
/// </summary>
public static string GetOSNameByUserAgent(string userAgent)
{
string osVersion = "未知";
if (userAgent.Contains("NT 6.0"))
{
osVersion = "Windows Vista/Server 2008";
}
else if (userAgent.Contains("NT 5.2"))
{
osVersion = "Windows Server 2003";
}
else if (userAgent.Contains("NT 5.1"))
{
osVersion = "Windows XP";
}
else if (userAgent.Contains("NT 5"))
{
osVersion = "Windows 2000";
}
else if (userAgent.Contains("NT 4"))
{
osVersion = "Windows NT4";
}
else if (userAgent.Contains("Me"))
{
osVersion = "Windows Me";
}
else if (userAgent.Contains("98"))
{
osVersion = "Windows 98";
}
else if (userAgent.Contains("95"))
{
osVersion = "Windows 95";
}
else if (userAgent.Contains("Mac"))
{
osVersion = "Mac";
}
else if (userAgent.Contains("Unix"))
{
osVersion = "UNIX";
}
else if (userAgent.Contains("Linux"))
{
osVersion = "Linux";
}
else if (userAgent.Contains("SunOS"))
{
osVersion = "SunOS";
}
return osVersion;
}
/// <summary>
/// 字符串如果操过指定长度则将超出的部分用指定字符串代替
/// </summary>
/// <param name="p_SrcString">要检查的字符串</param>
/// <param name="p_Length">指定长度</param>
/// <param name="p_TailString">用于替换的字符串</param>
/// <returns>截取后的字符串</returns>
public static string GetSubString(string p_SrcString, int p_Length, string p_TailString)
{
return GetSubString(p_SrcString, 0, p_Length, p_TailString);
}
/// <summary>
/// 取指定长度的字符串
/// </summary>
/// <param name="p_SrcString">要检查的字符串</param>
/// <param name="p_StartIndex">起始位置</param>
/// <param name="p_Length">指定长度</param>
/// <param name="p_TailString">用于替换的字符串</param>
/// <returns>截取后的字符串</returns>
public static string GetSubString(string p_SrcString, int p_StartIndex, int p_Length, string p_TailString)
{
string myResult = p_SrcString;
//当是日文或韩文时(注:中文的范围:/u4e00 - /u9fa5, 日文在/u0800 - /u4e00, 韩文为/xAC00-/xD7A3)
if (System.Text.RegularExpressions.Regex.IsMatch(p_SrcString, "[/u0800-/u4e00]+") ||
System.Text.RegularExpressions.Regex.IsMatch(p_SrcString, "[/xAC00-/xD7A3]+"))
{
//当截取的起始位置超出字段串长度时
if (p_StartIndex >= p_SrcString.Length)
{
return "";
}
else
{
return p_SrcString.Substring(p_StartIndex,
((p_Length + p_StartIndex) > p_SrcString.Length) ? (p_SrcString.Length - p_StartIndex) : p_Length);
}
}
if (p_Length >= 0)
{
byte[] bsSrcString = Encoding.Default.GetBytes(p_SrcString);
//当字符串长度大于起始位置
if (bsSrcString.Length > p_StartIndex)
{
int p_EndIndex = bsSrcString.Length;
//当要截取的长度在字符串的有效长度范围内
if (bsSrcString.Length > (p_StartIndex + p_Length))
{
p_EndIndex = p_Length + p_StartIndex;
}
else
{ //当不在有效范围内时,只取到字符串的结尾
p_Length = bsSrcString.Length - p_StartIndex;
p_TailString = "";
}
int nRealLength = p_Length;
int[] anResultFlag = new int[p_Length];
byte[] bsResult = null;
int nFlag = 0;
for (int i = p_StartIndex; i < p_EndIndex; i++)
{
if (bsSrcString[i] > 127)
{
nFlag++;
if (nFlag == 3)
{
nFlag = 1;
}
}
else
{
nFlag = 0;
}
anResultFlag[i] = nFlag;
}
if ((bsSrcString[p_EndIndex - 1] > 127) && (anResultFlag[p_Length - 1] == 1))
{
nRealLength = p_Length + 1;
}
bsResult = new byte[nRealLength];
Array.Copy(bsSrcString, p_StartIndex, bsResult, 0, nRealLength);
myResult = Encoding.Default.GetString(bsResult);
myResult = myResult + p_TailString;
}
}
return myResult;
}
/// <summary>
/// 获得当前页面客户端的IP
/// </summary>
/// <returns>当前页面客户端的IP</returns>
public static string GetIP()
{
string result = String.Empty;
result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (null == result || result == String.Empty)
{
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
if (null == result || result == String.Empty)
{
result = HttpContext.Current.Request.UserHostAddress;
}
if (null == result || result == String.Empty || !IsIP(result))
{
return "0.0.0.0";
}
return result;
}
/// <summary>
/// 是否为ip
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public static bool IsIP(string ip)
{
return Regex.IsMatch(ip, @"^((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?)$");
}
/// <summary>
/// 转全角的函数(SBC case)
/// </summary>
/// <param name="input">任意字符串</param>
/// <returns>全角字符串</returns>
///<remarks>
///全角空格为12288,半角空格为32
///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
///</remarks>
public static string ToSBC(string input)
{
//半角转全角:
char[] c = input.ToCharArray();
for (int i = 0; i < c.Length; i++)
{
if (c[i] == 32)
{
c[i] = (char)12288;
continue;
}
if (c[i] < 127)
c[i] = (char)(c[i] + 65248);
}
return new string(c);
}
/// <summary>
/// 转半角的函数(DBC case)
/// </summary>
/// <param name="input">任意字符串</param>
/// <returns>半角字符串</returns>
///<remarks>
///全角空格为12288,半角空格为32
///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
///</remarks>
public static string ToDBC(string input)
{
char[] c = input.ToCharArray();
for (int i = 0; i < c.Length; i++)
{
if (c[i] == 12288)
{
c[i] = (char)32;
continue;
}
if (c[i] > 65280 && c[i] < 65375)
c[i] = (char)(c[i] - 65248);
}
return new string(c);
}
}
}