You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

431 lines
14 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.IO;
  5. using System.Text;
  6. namespace Apewer.Internals
  7. {
  8. internal class TextConverter
  9. {
  10. /// <summary>将文本以 UTF-8 转换为字节数组。</summary>
  11. public static byte[] ToBinary(string argText)
  12. {
  13. return ToBinary(argText, Encoding.UTF8);
  14. }
  15. /// <summary>将文本以转换为字节数组。</summary>
  16. public static byte[] ToBinary(string argText, Encoding argEncoding)
  17. {
  18. var vnull = Constant.EmptyBytes;
  19. if (string.IsNullOrEmpty(argText)) return vnull;
  20. if (argEncoding == null) return vnull;
  21. try { return argEncoding.GetBytes(argText); }
  22. catch { return vnull; }
  23. }
  24. /// <summary>将字节数组以 UTF-8 转换为文本。</summary>
  25. public static string FromBinary(byte[] argBytes)
  26. {
  27. var vnull = "";
  28. if (argBytes.Length < 1) return vnull;
  29. try { return Encoding.UTF8.GetString(argBytes); }
  30. catch { return vnull; }
  31. }
  32. /// <summary>将字节数组转换为文本。</summary>
  33. public static string FromBinary(byte[] argBytes, Encoding argEncoding)
  34. {
  35. var vnull = "";
  36. if (argBytes.Length < 1) return vnull;
  37. if (argEncoding == null) return vnull;
  38. try { return argEncoding.GetString(argBytes); }
  39. catch { return vnull; }
  40. }
  41. /// <summary>将明文文本以 UTF-8 转换为 Base64 文本。</summary>
  42. public static string ToBase64(string argPlain)
  43. {
  44. var vbytes = ToBinary(argPlain);
  45. var vcipher = ByteHelper.ToBase64(vbytes);
  46. return vcipher;
  47. }
  48. /// <summary>将 Base64 文本以 UTF-8 转换为明文文本。</summary>
  49. public static string FromBase64(string argCipher)
  50. {
  51. var vbytes = ByteHelper.FromBase64(argCipher);
  52. var vplain = FromBinary(vbytes);
  53. return vplain;
  54. }
  55. /// <summary>将文本转换为 DataTable 对象。</summary>
  56. public static DataTable ToDataTable(List<string[]> argNestedText)
  57. {
  58. var vtable = new DataTable();
  59. if (argNestedText == null) return vtable;
  60. var vcolumns = 0;
  61. foreach (var vrow in argNestedText)
  62. {
  63. if (vrow == null) continue;
  64. if (vrow.Length > vcolumns) vcolumns = vrow.Length;
  65. for (int i = 0; i < vcolumns; i++) if (vrow[i] == null) vrow[i] = "";
  66. }
  67. for (int i = 0; i < vcolumns; i++) vtable.Columns.Add("Column_" + vtable.Columns.Count.ToString());
  68. foreach (var vrow in argNestedText) vtable.Rows.Add(vrow);
  69. return vtable;
  70. }
  71. /// <summary>将文本转换为 DataTable 对象。</summary>
  72. public static DataTable ToDataTable(List<List<string>> argNestedText)
  73. {
  74. var vtable = new DataTable();
  75. if (argNestedText == null) return vtable;
  76. var vcolumns = 0;
  77. foreach (var vrow in argNestedText)
  78. {
  79. if (vrow == null) continue;
  80. if (vrow.Count > vcolumns) vcolumns = vrow.Count;
  81. for (int i = 0; i < vcolumns; i++) if (vrow[i] == null) vrow[i] = "";
  82. }
  83. for (int i = 0; i < vcolumns; i++) vtable.Columns.Add("Column_" + vtable.Columns.Count.ToString());
  84. foreach (var vrow in argNestedText) vtable.Rows.Add(vrow.ToArray());
  85. return vtable;
  86. }
  87. /// <summary>byte -> plain</summary>
  88. public static string EncodeByte(byte argByte)
  89. {
  90. return Constant.HexCollection[argByte / 16].ToString() + Constant.HexCollection[argByte % 16].ToString();
  91. }
  92. /// <summary>binary -> plain</summary>
  93. public static string EncodeBinary(byte[] argBytes)
  94. {
  95. try
  96. {
  97. int vlength = argBytes.Length;
  98. if (vlength > 0)
  99. {
  100. var vb = new TextBuilder();
  101. for (int i = 0; i < vlength; i++) vb.Append(EncodeByte(argBytes[i]));
  102. return vb.Value;
  103. }
  104. }
  105. finally { }
  106. return "";
  107. }
  108. /// <summary>text -> plain</summary>
  109. public static string EncodeText(string argText, bool argDelimiter = false)
  110. {
  111. if (!string.IsNullOrEmpty(argText))
  112. {
  113. if (argDelimiter)
  114. {
  115. string vcell;
  116. var vb = new TextBuilder();
  117. for (int i = 0; i < argText.Length; i++)
  118. {
  119. vcell = argText.Substring(i, 1);
  120. vcell = EncodeBinary(Encoding.UTF8.GetBytes(vcell));
  121. vb.Append("<" + vcell + ">");
  122. }
  123. return vb.Value;
  124. }
  125. else
  126. {
  127. return EncodeBinary(Encoding.UTF8.GetBytes(argText));
  128. }
  129. }
  130. else return "";
  131. }
  132. /// <summary>plain -> binary</summary>
  133. public static byte[] DecodeBinary(string hex)
  134. {
  135. if (string.IsNullOrEmpty(hex)) return Constant.EmptyBytes;
  136. string vplain = TextHelper.LCase(hex);
  137. byte[] vresult;
  138. if (TextHelper.Len(vplain) >= 2)
  139. {
  140. MemoryStream vmsold = null;
  141. MemoryStream vmsnew = null;
  142. try
  143. {
  144. int vcell;
  145. vmsold = new MemoryStream(Encoding.ASCII.GetBytes(vplain));
  146. vmsnew = new MemoryStream();
  147. long vlength = vmsold.Length;
  148. if ((vlength % 2) == 0)
  149. {
  150. for (int i = 1; i <= (vlength / 2); i++)
  151. {
  152. vcell = GetHex(vmsold.ReadByte()) * 16;
  153. vcell = vcell + GetHex(vmsold.ReadByte());
  154. vmsnew.WriteByte(Convert.ToByte(vcell));
  155. }
  156. }
  157. vresult = vmsnew.ToArray();
  158. }
  159. catch
  160. {
  161. vresult = Constant.EmptyBytes;
  162. }
  163. finally
  164. {
  165. vmsnew.Dispose();
  166. vmsold.Dispose();
  167. }
  168. }
  169. else
  170. {
  171. vresult = Constant.EmptyBytes;
  172. }
  173. return vresult;
  174. }
  175. /// <summary>plain -> text</summary>
  176. public static string DecodeText(string argPlain)
  177. {
  178. if (string.IsNullOrEmpty(argPlain)) return "";
  179. string vplain = TextHelper.LCase(argPlain);
  180. vplain = vplain.Replace("<", "");
  181. vplain = vplain.Replace(">", "");
  182. if (vplain.Length >= 2)
  183. {
  184. byte[] vbytes = DecodeBinary(vplain);
  185. if (vbytes.Length > 0) return Encoding.UTF8.GetString(vbytes);
  186. }
  187. return "";
  188. }
  189. /// <summary>ascii -> hex</summary>
  190. public static byte GetHex(byte argAscii)
  191. {
  192. if ((argAscii >= 48) && (argAscii <= 57)) return Convert.ToByte(argAscii - 48);
  193. if ((argAscii >= 97) && (argAscii <= 122)) return Convert.ToByte(argAscii - 87);
  194. return 0;
  195. }
  196. /// <summary>ascii -> hex</summary>
  197. public static byte GetHex(int argAscii)
  198. {
  199. try
  200. {
  201. if ((argAscii >= 48) && (argAscii <= 57)) return Convert.ToByte(argAscii - 48);
  202. if ((argAscii >= 97) && (argAscii <= 122)) return Convert.ToByte(argAscii - 87);
  203. }
  204. catch { }
  205. return 0;
  206. }
  207. /// <summary>将字节数组格式化为字符串。</summary>
  208. public static string FormatX2(params byte[] argBytes)
  209. {
  210. var sb = new System.Text.StringBuilder();
  211. for (int i = 0; i < argBytes.Length; i++) sb.Append(argBytes[i].ToString("x2"));
  212. return sb.ToString();
  213. }
  214. /// <summary>获取单精度浮点对象。</summary>
  215. public static Single GetSingle(string argValue)
  216. {
  217. if (!string.IsNullOrEmpty(argValue))
  218. {
  219. try
  220. {
  221. if (TextVerifier.IsNumber(argValue))
  222. {
  223. return Convert.ToSingle(argValue);
  224. }
  225. }
  226. catch { }
  227. }
  228. return 0;
  229. }
  230. /// <summary>获取双精度浮点对象。</summary>
  231. public static Double GetDouble(string argValue)
  232. {
  233. if (!string.IsNullOrEmpty(argValue))
  234. {
  235. try
  236. {
  237. if (TextVerifier.IsNumber(argValue))
  238. {
  239. return Convert.ToDouble(argValue);
  240. }
  241. }
  242. catch { }
  243. }
  244. return 0D;
  245. }
  246. /// <summary>获取 Decimal 对象。</summary>
  247. public static decimal GetDecimal(string argValue)
  248. {
  249. decimal result = 0;
  250. if (!string.IsNullOrEmpty(argValue))
  251. {
  252. try
  253. {
  254. result = Convert.ToDecimal(argValue);
  255. }
  256. catch
  257. {
  258. try
  259. {
  260. result = decimal.Parse(argValue, System.Globalization.NumberStyles.Float);
  261. }
  262. catch { }
  263. }
  264. }
  265. return result;
  266. }
  267. /// <summary>获取 Byte 对象。</summary>
  268. public static Byte GetByte(string argValue)
  269. {
  270. if (!string.IsNullOrEmpty(argValue))
  271. {
  272. try
  273. {
  274. if (TextVerifier.IsInteger(argValue))
  275. {
  276. return Convert.ToByte(argValue);
  277. }
  278. }
  279. catch { }
  280. }
  281. return 0;
  282. }
  283. /// <summary>获取 SByte 对象。</summary>
  284. public static SByte GetSByte(string argValue)
  285. {
  286. if (!string.IsNullOrEmpty(argValue))
  287. {
  288. try
  289. {
  290. if (TextVerifier.IsInteger(argValue))
  291. {
  292. return Convert.ToSByte(argValue);
  293. }
  294. }
  295. catch { }
  296. }
  297. return 0;
  298. }
  299. /// <summary>获取 Int16 对象。</summary>
  300. public static Int16 GetInt16(string argValue)
  301. {
  302. if (!string.IsNullOrEmpty(argValue))
  303. {
  304. try
  305. {
  306. if (TextVerifier.IsInteger(argValue))
  307. {
  308. return Convert.ToInt16(argValue);
  309. }
  310. }
  311. catch { }
  312. }
  313. return 0;
  314. }
  315. /// <summary>获取 UInt16 对象。</summary>
  316. public static UInt16 GetUInt16(string argValue)
  317. {
  318. if (!string.IsNullOrEmpty(argValue))
  319. {
  320. try
  321. {
  322. if (TextVerifier.IsInteger(argValue))
  323. {
  324. return Convert.ToUInt16(argValue);
  325. }
  326. }
  327. catch { }
  328. }
  329. return 0;
  330. }
  331. /// <summary>获取 Int32 对象。</summary>
  332. public static Int32 GetInt32(string argValue)
  333. {
  334. if (!string.IsNullOrEmpty(argValue))
  335. {
  336. try
  337. {
  338. if (TextVerifier.IsInteger(argValue))
  339. {
  340. return Convert.ToInt32(argValue);
  341. }
  342. }
  343. catch { }
  344. }
  345. return 0;
  346. }
  347. /// <summary>获取 UInt32 对象。</summary>
  348. public static UInt32 GetUInt32(string argValue)
  349. {
  350. if (!string.IsNullOrEmpty(argValue))
  351. {
  352. try
  353. {
  354. if (TextVerifier.IsInteger(argValue))
  355. {
  356. return Convert.ToUInt32(argValue);
  357. }
  358. }
  359. catch { }
  360. }
  361. return 0;
  362. }
  363. /// <summary>获取 Int64 对象。</summary>
  364. public static Int64 GetInt64(string argValue)
  365. {
  366. if (!string.IsNullOrEmpty(argValue))
  367. {
  368. try
  369. {
  370. if (TextVerifier.IsInteger(argValue))
  371. {
  372. return Convert.ToInt64(argValue);
  373. }
  374. }
  375. catch { }
  376. }
  377. return 0;
  378. }
  379. /// <summary>获取 UInt64 对象。</summary>
  380. public static UInt64 GetUInt64(string argValue)
  381. {
  382. if (!string.IsNullOrEmpty(argValue))
  383. {
  384. try
  385. {
  386. if (TextVerifier.IsInteger(argValue))
  387. {
  388. return Convert.ToUInt64(argValue);
  389. }
  390. }
  391. catch { }
  392. }
  393. return 0;
  394. }
  395. }
  396. }