| using System; | 
| using System.Text; | 
| using System.Text.RegularExpressions; | 
|   | 
| namespace Top.Api.Util | 
| { | 
|     public abstract class StringUtil | 
|     { | 
|         private const string pattern = @"^\d*$"; | 
|         private static readonly Regex REG_CIDR = new Regex("^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})/(\\d{1,2})$"); | 
|   | 
|   | 
|         public static bool IsNumeric(string obj) | 
|         { | 
|             if (obj == null) | 
|             { | 
|                 return false; | 
|             } | 
|             char[] chars = obj.ToCharArray(); | 
|             int length = chars.Length; | 
|             if (length < 1) | 
|                 return false; | 
|   | 
|             int i = 0; | 
|             if (length > 1 && chars[0] == '-') | 
|                 i = 1; | 
|   | 
|             for (; i < length; i++) | 
|             { | 
|                 if (!Char.IsDigit(chars[i])) | 
|                 { | 
|                     return false; | 
|                 } | 
|             } | 
|             return true; | 
|         } | 
|   | 
|         public static bool IsDigits(string value) | 
|         { | 
|             if (string.IsNullOrEmpty(value)) | 
|             { | 
|                 return false; | 
|             } | 
|             return Regex.IsMatch(value, pattern); | 
|         } | 
|   | 
|         public static string[] Split(string data, char separatorChar) | 
|         { | 
|             if (string.IsNullOrEmpty(data)) | 
|             { | 
|                 return null; | 
|             } | 
|             return data.Split(new char[] { separatorChar }, StringSplitOptions.RemoveEmptyEntries); | 
|         } | 
|   | 
|         public static string ToCamelStyle(string name) | 
|         { | 
|             if (string.IsNullOrEmpty(name)) | 
|             { | 
|                 return name; | 
|             } | 
|   | 
|             char[] chars = name.ToCharArray(); | 
|             StringBuilder buf = new StringBuilder(chars.Length); | 
|             for (int i = 0; i < chars.Length; i++) | 
|             { | 
|                 if (i == 0) | 
|                 { | 
|                     buf.Append(char.ToLower(chars[i])); | 
|                 } | 
|                 else | 
|                 { | 
|                     buf.Append(chars[i]); | 
|                 } | 
|             } | 
|             return buf.ToString(); | 
|         } | 
|   | 
|         public static string ToUnderlineStyle(string name) | 
|         { | 
|             if (string.IsNullOrEmpty(name)) | 
|             { | 
|                 return name; | 
|             } | 
|   | 
|             StringBuilder buf = new StringBuilder(); | 
|             for (int i = 0; i < name.Length; i++) | 
|             { | 
|                 char c = name[i]; | 
|                 if (char.IsUpper(c)) | 
|                 { | 
|                     if (i > 0) | 
|                     { | 
|                         buf.Append("_"); | 
|                     } | 
|                     buf.Append(char.ToLower(c)); | 
|                 } | 
|                 else | 
|                 { | 
|                     buf.Append(c); | 
|                 } | 
|             } | 
|             return buf.ToString(); | 
|         } | 
|   | 
|         public static string EscapeXml(string value) | 
|         { | 
|             if (string.IsNullOrEmpty(value)) | 
|             { | 
|                 return value; | 
|             } | 
|   | 
|             StringBuilder buf = new StringBuilder(); | 
|             char[] chars = value.ToCharArray(); | 
|   | 
|             for (int i = 0; i < chars.Length; i++) | 
|             { | 
|                 char c = chars[i]; | 
|                 switch (c) | 
|                 { | 
|                     case '<': | 
|                         buf.Append("<"); | 
|                         break; | 
|                     case '>': | 
|                         buf.Append(">"); | 
|                         break; | 
|                     case '\'': | 
|                         buf.Append("'"); | 
|                         break; | 
|                     case '&': | 
|                         buf.Append("&"); | 
|                         break; | 
|                     case '"': | 
|                         buf.Append("""); | 
|                         break; | 
|                     default: | 
|                         if ((c == 0x9) || (c == 0xA) || (c == 0xD) || ((c >= 0x20) && (c <= 0xD7FF)) | 
|                         || ((c >= 0xE000) && (c <= 0xFFFD)) || ((c >= 0x10000) && (c <= 0x10FFFF))) | 
|                         { | 
|                             buf.Append(c); | 
|                         } | 
|                         break; | 
|                 } | 
|             } | 
|   | 
|             return buf.ToString(); | 
|         } | 
|   | 
|         public static string FormatDateTime(DateTime dateTime) | 
|         { | 
|             return dateTime.ToString(Constants.DATE_TIME_FORMAT); | 
|         } | 
|   | 
|         public static bool IsIpInRange(string ipAddr, string cidrAddr) | 
|         { | 
|             Match match = REG_CIDR.Match(cidrAddr); | 
|             if (!match.Success) | 
|             { | 
|                 throw new TopException("Invalid CIDR address: " + cidrAddr); | 
|             } | 
|   | 
|             int[] minIpParts = new int[4]; | 
|             int[] maxIpParts = new int[4]; | 
|             string[] ipParts = match.Groups[1].Value.Split(new string[1] { "." }, StringSplitOptions.None); | 
|             int intMask = int.Parse(match.Groups[2].Value); | 
|   | 
|             for (int i = 0; i < ipParts.Length; i++) | 
|             { | 
|                 int ipPart = int.Parse(ipParts[i]); | 
|                 if (intMask > 8) | 
|                 { | 
|                     minIpParts[i] = ipPart; | 
|                     maxIpParts[i] = ipPart; | 
|                     intMask -= 8; | 
|                 } | 
|                 else if (intMask > 0) | 
|                 { | 
|                     minIpParts[i] = ipPart >> intMask; | 
|                     maxIpParts[i] = ipPart | (0xFF >> intMask); | 
|                     intMask = 0; | 
|                 } | 
|                 else | 
|                 { | 
|                     minIpParts[i] = 1; | 
|                     maxIpParts[i] = 0xFF - 1; | 
|                 } | 
|             } | 
|   | 
|             string[] realIpParts = ipAddr.Split(new string[1] { "." }, StringSplitOptions.None); | 
|             for (int i = 0; i < realIpParts.Length; i++) | 
|             { | 
|                 int realIp = int.Parse(realIpParts[i]); | 
|                 if (realIp < minIpParts[i] || realIp > maxIpParts[i]) | 
|                 { | 
|                     return false; | 
|                 } | 
|             } | 
|             return true; | 
|         } | 
|     } | 
| } |