C#常用方法二

时间:2022-12-09 21:25:53
  1   public sealed class StringTool
2 {
3 /// <summary>
4 /// 将txt文件读入字符串
5 /// </summary>
6 /// <param name="aPath"></param>
7 /// <returns></returns>
8 public static string ReadTextFile(string aPath)
9 {
10 string text = "";
11 using (TextReader tr = new StreamReader(aPath))
12 {
13 text = tr.ReadToEnd();
14 }
15 return text;
16 }
17
18 /// <summary>
19 /// 将16进行编码的字符串写入到指定的文件路径
20 /// </summary>
21 /// <param name="aPath"></param>
22 /// <param name="aText"></param>
23 public static void WriteTextFile(string aPath, string aText)
24 {
25 using (TextWriter tw = new StreamWriter(aPath))
26 {
27 tw.Write(aText);
28 }
29 }
30
31 /// <summary>
32 /// 序列化DataTable,
33 /// </summary>
34 /// <param name="aTable">需要序列化的DataTable</param>
35 /// <returns>成功返回非空字符串</returns>
36 public static string SerializerToXml(DataTable aTable)
37 {
38 StringBuilder sb = new StringBuilder();
39 if (aTable == null)
40 return "";
41
42 System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(System.Data.DataTable));
43 System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(sb);
44 serializer.Serialize(writer, aTable);
45
46 return sb.ToString();
47 }
48
49 /// <summary>
50 /// 反序列化DataTable表
51 /// </summary>
52 /// <param name="aXmlData">需要反序列化的DataTable的数据</param>
53 /// <returns>成功返回DataTable,失败返回null</returns>
54 public static DataTable DeSerializerFromXml(string aXmlData)
55 {
56 if (string.IsNullOrEmpty(aXmlData))
57 return null;
58
59 System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(System.Data.DataTable));
60 return (DataTable)serializer.Deserialize(new StringReader(aXmlData));
61 }
62
63 /*
64 // 字符串进行16进制编码[decodeSTR],因为编码后位数不等,为了节约空间不进行等长操作,所以并以","分隔
65 // 与 StringTool.cs的函数相对应
66 function EncodeSTR(str) {
67 var t = "";
68 for (var x = 0; x < str.length; x++) {
69 a = str.charCodeAt(x);
70 if (x != 0) {
71 t += ',';
72 }
73 t += a.toString(16).toUpperCase();
74 }
75 return t;
76 }
77 //字符串[以","分隔]进行16进制解码,编码用[encodeSTR]
78 // 与 StringTool.cs的函数相对应
79 function DecodeSTR(str) {
80 var a1 = str.split(',');
81 for (var x = 0; x < a1.length; x++) {
82 a1[x] = String.fromCharCode(parseInt(a1[x], 16).toString(10));
83 }
84 return a1.join('');
85 }
86 */
87 /// <summary>
88 /// 字符串转为用,分隔的16进制字符串 解码用[decodeSTR] 与 StringTool.js的函数相对应
89 /// </summary>
90 /// <param name="str">字符串</param>
91 /// <param name="uppercase">大小写</param>
92 /// <returns>失败返回空字符串</returns>
93 static public string EncodeSTR(string str, bool uppercase = true)
94 {
95 if (string.IsNullOrEmpty(str))
96 return "";
97 Char[] aa = str.ToCharArray();
98 StringBuilder sb = new StringBuilder();
99 string strFormat = "{0:" + (uppercase == true ? "X" : "x") + "}";
100 for (int i = 0; i < str.Length; i++)
101 {
102 sb.Append(String.Format(strFormat, Char.ConvertToUtf32(str, i)));
103 sb.Append(",");
104 }
105 if (sb.Length > 0)
106 sb.Remove(sb.Length - 1, 1);
107 return sb.ToString();
108 }
109
110 /// <summary>
111 /// 用,分隔的16进制字符串转为字符串 编码用[EncodeSTR] 与 StringTool.js的函数相对应
112 /// </summary>
113 /// <param name="str">用,分隔的16进制字符串</param>
114 /// <returns>失败返回空字符串</returns>
115 static public string DecodeSTR(string str)
116 {
117 if (string.IsNullOrEmpty(str))
118 return "";
119 string[] aHexString = str.Split(new char[] { ',' });
120 StringBuilder sb = new StringBuilder();
121 for (int i = 0; i < aHexString.Length; i++)
122 {
123 sb.Append(Char.ConvertFromUtf32(Convert.ToInt32(aHexString[i], 16)));
124 }
125 return sb.ToString();
126 }
127
128 /// <summary>
129 /// 将字符串转为16进制字符串,并进行了异或加密
130 /// </summary>
131 /// <param name="aStr"></param>
132 /// <returns></returns>
133 public static string StringToHexString(string aStr)
134 {
135 if (string.IsNullOrEmpty(aStr))
136 return "";
137 byte[] b = Encoding.Unicode.GetBytes(EncryptXOR(aStr));
138 return ArrayToHexString(b);
139 }
140
141 /// <summary>
142 /// 将16进制字符串转为字符串,并进行了异或解密
143 /// </summary>
144 /// <param name="aStr"></param>
145 /// <returns></returns>
146 public static string HexStringToString(string aStr)
147 {
148 if (string.IsNullOrEmpty(aStr))
149 return "";
150 byte[] b = HexStringToArray(aStr);
151 return DecryptXOR(Encoding.Unicode.GetString(b));
152 }
153
154 /// <summary>
155 /// 字节数组到16进制字符串
156 /// </summary>
157 /// <param name="array"></param>
158 /// <param name="uppercase">大小写</param>
159 /// <returns>失败返回空字符串</returns>
160 ///
161 static public string ArrayToHexString(byte[] array, bool uppercase = true)
162 {
163 if (array == null || array.Length < 1) return "";
164 string format = "x2";
165 if (uppercase) format = "X2";
166 StringBuilder sb = new StringBuilder();
167 foreach (byte b in array) sb.Append(b.ToString(format));
168 return sb.ToString();
169 }
170
171 /// <summary>
172 /// 将16进制字符串转为字节数组
173 /// </summary>
174 /// <param name="aHexString"></param>
175 /// <param name="uppercase"></param>
176 /// <returns></returns>
177 static public byte[] HexStringToArray(string aHexString, bool uppercase = true)
178 {
179 if (string.IsNullOrEmpty(aHexString))
180 return null;
181 int count = aHexString.Length / 2;
182 byte[] b = new byte[count];
183 for (int i = 0; i < count; i++)
184 {
185 string s = aHexString.Substring(i * 2, 2);
186 b[i] = byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
187 }
188
189 return b;
190 }
191
192 /// <summary>
193 /// 在unicode 字符串中,中文的范围是在4E00..9FFF
194 // 通过对字符的unicode编码进行判断来确定字符是否为中文。
195 /// </summary>
196 /// <param name="word"></param>
197 /// <returns></returns>
198 static public bool IsChineseLetter(string word)
199 {
200 int code = 0;
201 int chfrom = Convert.ToInt32("4e00", 16); //范围(0x4e00~0x9fff)转换成int(chfrom~chend)
202 int chend = Convert.ToInt32("9fff", 16);
203 if (word != "")
204 {
205 code = Char.ConvertToUtf32(word, 0); //获得字符word中指定索引index处字符unicode编码
206 if (code >= chfrom && code <= chend)
207 return true; //当code在中文范围内返回true
208 else
209 return false; //当code不在中文范围内返回false
210 }
211 return false;
212 }
213
214 /// <summary>
215 /// 判断句子中是否含有中文
216 /// </summary>
217 /// <param >字符串</param>
218 /// <returns></returns>
219 static public bool WordsInChinese(string aStr)
220 {
221 Regex rx = new Regex("^[\u4e00-\u9fa5]$");
222 for (int i = 0; i < aStr.Length; i++)
223 {
224 if (rx.IsMatch(aStr[i].ToString()))
225 return true;
226 }
227 return false;
228 }
229
230 /// <summary>
231 /// 给定一个字符串,判断其是否只包含有汉字
232 /// </summary>
233 /// <param name="aStr"></param>
234 /// <returns></returns>
235 static public bool IsOnlyContainsChinese(string aStr)
236 {
237 char[] words = aStr.ToCharArray();
238 foreach (char word in words)
239 {
240 if (IsGBCode(word.ToString()) || IsGBKCode(word.ToString())) // it is a GB2312 or GBK chinese word
241 continue;
242 else
243 return false;
244 }
245 return true;
246 }
247
248 /// <summary>
249 /// 判断一个word是否为GB2312编码的汉字
250 /// </summary>
251 /// <param name="word"></param>
252 /// <returns></returns>
253 static public bool IsGBCode(string word)
254 {
255 byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(word);
256 if (bytes.Length <= 1) // if there is only one byte, it is ASCII code or other code
257 return false;
258 else
259 {
260 byte byte1 = bytes[0];
261 byte byte2 = bytes[1];
262 if (byte1 >= 176 && byte1 <= 247 && byte2 >= 160 && byte2 <= 254) //判断是否是GB2312
263 return true;
264 else
265 return false;
266 }
267 }
268
269 /// <summary>
270 /// 判断一个word是否为GBK编码的汉字
271 /// </summary>
272 /// <param name="word"></param>
273 /// <returns></returns>
274 static public bool IsGBKCode(string word)
275 {
276 byte[] bytes = Encoding.GetEncoding("GBK").GetBytes(word.ToString());
277 if (bytes.Length <= 1) // if there is only one byte, it is ASCII code
278 return false;
279 else
280 {
281 byte byte1 = bytes[0];
282 byte byte2 = bytes[1];
283 if (byte1 >= 129 && byte1 <= 254 && byte2 >= 64 && byte2 <= 254) //判断是否是GBK编码
284 return true;
285 else
286 return false;
287 }
288 }
289
290 /// <summary>
291 /// 判断一个word是否为Big5编码的汉字
292 /// </summary>
293 /// <param name="word"></param>
294 /// <returns></returns>
295 static public bool IsBig5Code(string word)
296 {
297 byte[] bytes = Encoding.GetEncoding("Big5").GetBytes(word.ToString());
298 if (bytes.Length <= 1) // if there is only one byte, it is ASCII code
299 return false;
300 else
301 {
302 byte byte1 = bytes[0];
303 byte byte2 = bytes[1];
304 if ((byte1 >= 129 && byte1 <= 254) && ((byte2 >= 64 && byte2 <= 126) || (byte2 >= 161 && byte2 <= 254))) //判断是否是Big5编码
305 return true;
306 else
307 return false;
308 }
309 }
310
311 /// <summary>
312 /// 对字符串进行简单的异或加密
313 /// </summary>
314 /// <param name="aStr"></param>
315 /// <param name="aXor"></param>
316 /// <returns>失败返回空字符串</returns>
317 static public string EncryptXOR(string aStr, byte aXor = 0x11)
318 {
319 if (String.IsNullOrEmpty(aStr))
320 return "";
321 byte[] bb = Encoding.Unicode.GetBytes(aStr);
322 for (int i = 0; i < bb.Length; i++)
323 bb[i] ^= aXor;
324 return Encoding.Unicode.GetString(bb);
325 }
326
327 /// <summary>
328 /// 对字符串进行简单的异或解密
329 /// </summary>
330 /// <param name="aStr"></param>
331 /// <param name="aXor"></param>
332 /// <returns>失败返回空字符串</returns>
333 static public string DecryptXOR(string aStr, byte aXor = 0x11)
334 {
335 if (String.IsNullOrEmpty(aStr))
336 return "";
337 byte[] bb = Encoding.Unicode.GetBytes(aStr);
338 for (int i = 0; i < bb.Length; i++)
339 bb[i] ^= aXor;
340 return Encoding.Unicode.GetString(bb);
341 }
342
343 /// <summary>
344 /// 获得字符串中开始和结束字符串中间得字符
345 /// </summary>
346 /// <param name="str">字符串</param>
347 /// <param name="s">开始</param>
348 /// <param name="e">结束</param>
349 /// </summary>
350 public static string GetSubString(string str, string s, string e)
351 {
352 Regex rg = new Regex("(?<=(" + s + "))[.\\s\\S]*?(?=(" + e + "))", RegexOptions.Multiline | RegexOptions.Singleline);
353 return rg.Match(str).Value;
354 }
355
356 /// <summary>
357 /// 从最后一位验证前面17位的18位身份证号码
358 /// </summary>
359 /// <param name="id"></param>
360 /// <returns></returns>
361 public static bool CheckCardId(string id)
362 {
363 /* 身份证号码的验证及15位升18位算法
364 18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:
365 一、范围
366 该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
367 二、编码对象
368 公民身份号码的编码对象是具有*国籍的公民。
369 三、号码的结构和表示形式
370 1、号码的结构
371 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
372 2、地址码
373 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
374 3、出生日期码
375 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
376 4、顺序码
377 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
378 5、校验码
379 (1)十七位数字本体码加权求和公式
380 S = Sum(Ai * Wi),先对前17位数字的权求和
381 Ai:表示第i位置上的身份证号码数字值
382 Wi:表示第i位置上的加权因子
383 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
384 (2)计算模 Y = mod(S, 11)
385 (3)通过模得到对应的校验码
386 Y: 0 1 2 3 4 5 6 7 8 9 10
387 校验码: 1 0 X 9 8 7 6 5 4 3 2
388 四、举例如下:
389 北京市朝阳区: 11010519491231002X
390 广东省汕头市: 440524188001010014
391 */
392
393 int[] wQuan = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
394 string checkWei = "10X98765432";
395
396 string number17 = id.Substring(0, 17);
397 string number18 = id.Substring(17);
398
399 int sum = 0;
400 for (int i = 0; i < 17; i++)
401 sum = sum + Convert.ToInt32(number17[i].ToString()) * wQuan[i];
402
403 int mod = sum % 11;
404 string result = checkWei[mod].ToString();
405 if (number18.Equals(result, StringComparison.OrdinalIgnoreCase))
406 {
407 return true;
408 }
409 else
410 {
411 return false;
412 }
413 }
414
415 /// <summary>
416 /// 生成一个序列号,根据Guid生成,最短1位,最长33位,默认是4位
417 /// </summary>
418 /// <param name="aLength"></param>
419 /// <returns></returns>
420 public static string CreateSerialNumber(int aLength = 4)
421 {
422 if (aLength < 1)
423 aLength = 1;
424 if (aLength > 33)
425 aLength = 33;
426
427 string str = string.Empty;
428 string codeStr = string.Empty;
429 string guidStr = Guid.NewGuid().ToString().Replace("-", "");
430 int guidStrLen = guidStr.Length;
431 Random rnd = new Random(int.Parse(DateTime.Now.ToString("MMddHHmmsss")));
432
433 for (int i = 0; i < aLength; i++)
434 {
435 int index = rnd.Next(0, guidStrLen - 1);
436 str += guidStr.Substring(index, 1);
437 }
438
439 return str.ToUpper();
440 }
441
442 /// <summary>
443 /// 反转字符串
444 /// </summary>
445 /// <param name="aString"></param>
446 /// <returns></returns>
447 public static string ReverseString(string aString)
448 {
449 if (string.IsNullOrEmpty(aString))
450 return "";
451 Char[] LS_Str = aString.ToCharArray();
452 Array.Reverse(LS_Str);
453
454 return new String(LS_Str);//反转字符串
455 }
456
457 /// <summary>
458 /// 全角转半角
459 /// </summary>
460 /// <param name="aString"></param>
461 /// <returns></returns>
462 public static string QjToBj(string aString)
463 {
464 string QJstr = aString;
465 char[] c = QJstr.ToCharArray();
466 for (int i = 0; i < c.Length; i++)
467 {
468 byte[] b = System.Text.Encoding.Unicode.GetBytes(c, i, 1);
469 if (b.Length == 2)
470 {
471 if (b[1] == 255)
472 {
473 b[0] = (byte)(b[0] + 32);
474 b[1] = 0;
475 c[i] = System.Text.Encoding.Unicode.GetChars(b)[0];
476 }
477 }
478 }
479 string strNew = new string(c);
480 return strNew;
481 }
482
483 /// <summary>
484 /// 获得汉字拼音的的第一个字母
485 /// </summary>
486 /// <param name="aText"></param>
487 /// <returns></returns>
488 static public string GetChineseSpellFirstLetter(string aText)
489 {
490 int len = aText.Length;
491 string myStr = "";
492 for (int i = 0; i < len; i++)
493 {
494 myStr += GetSpell(aText[i]);
495 }
496 return myStr.ToLower();
497 }
498
499 /// <summary>
500 /// 利用汉字在计算机里面的编码来的到汉字的拼音。
501 /// </summary>
502 /// <param name="aChar"></param>
503 /// <returns></returns>
504 static public string GetSpell(char aChar)
505 {
506 byte[] arrCN = Encoding.Default.GetBytes(aChar.ToString());
507 if (arrCN.Length > 1)
508 {
509 int area = (short)arrCN[0];
510 int pos = (short)arrCN[1];
511 int code = (area << 8) + pos;
512 int[] areacode = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };
513 for (int i = 0; i < 26; i++)
514 {
515 int max = 55290;
516 if (i != 25) max = areacode[i + 1];
517 if (areacode[i] <= code && code < max)
518 {
519 return Encoding.Default.GetString(new byte[] { (byte)(65 + i) });
520 }
521 }
522 return aChar.ToString();
523 }
524 else
525 return aChar.ToString();
526 }
527 }