DataStorageManager.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Security.Cryptography;
  5. using System.Text;
  6. namespace Island.StandardLib.Storage
  7. {
  8. public static class DataStorageManager
  9. {
  10. static readonly byte[] METAINF = new byte[64] { 33, 88, 67, 78, 66, 33, 32, 80, 104, 121, 83, 105, 109, 32, 83, 116, 111, 114, 97, 103, 101, 32, 70, 105, 108, 101, 32, 68, 79, 32, 78, 79, 84, 32, 69, 68, 73, 84, 32, 84, 72, 73, 83, 32, 70, 73, 76, 69, 32, 85, 83, 69, 32, 84, 69, 88, 84, 32, 69, 68, 73, 84, 79, 82 };
  11. /// <summary>
  12. /// 按照指定可序列化类型序列化此内存
  13. /// </summary>
  14. /// <typeparam name="T">可序列化类型</typeparam>
  15. public static T ReadData<T>(this byte[] bytes) where T : IStorable, new()
  16. {
  17. T instance = new T();
  18. DataStorage ds = new DataStorage(bytes);
  19. instance.ReadFromData(ds);
  20. return instance;
  21. }
  22. public static byte[] GetBytes(this IStorable data)
  23. {
  24. DataStorage ds = new DataStorage();
  25. data.WriteToData(ds);
  26. return ds.Bytes;
  27. }
  28. /// <summary>
  29. /// 将可序列化类型序列化并存入文件
  30. /// </summary>
  31. /// <param name="data">可序列化类型</param>
  32. /// <param name="writeTo">文件路径</param>
  33. public static void WriteFile(IStorable data, string writeTo)
  34. {
  35. DataStorage ds = new DataStorage();
  36. data.WriteToData(ds);
  37. if (File.Exists(writeTo)) File.Delete(writeTo);
  38. FileStream writer = new FileStream(writeTo, FileMode.Create, FileAccess.Write);
  39. writer.Write(ds.Bytes, 0, ds.Size);
  40. writer.Flush();
  41. writer.Close();
  42. }
  43. public static void WriteFileWithMd(IStorable data, IStorable metadata, string writeTo)
  44. {
  45. byte[] buff_md = metadata.GetBytes(), buff_dat = data.GetBytes();
  46. int pmetadata = METAINF.Length, pbody = pmetadata + buff_md.Length;
  47. FileStream writer = new FileStream(writeTo, FileMode.Create, FileAccess.Write);
  48. writer.Write(BitConverter.GetBytes(pmetadata + 8), 0, 4);
  49. writer.Write(BitConverter.GetBytes(pbody + 8), 0, 4);
  50. writer.Write(METAINF, 0, METAINF.Length);
  51. writer.Flush();
  52. writer.Write(buff_md, 0, buff_md.Length);
  53. writer.Flush();
  54. writer.Write(buff_dat, 0, buff_dat.Length);
  55. writer.Flush();
  56. writer.Close();
  57. }
  58. public static string WriteToString(IStorable data) => Convert.ToBase64String(data.GetBytes());
  59. public static T ReadFromString<T>(string str) where T : IStorable, new() => Convert.FromBase64String(str).ReadData<T>();
  60. public static string WriteToString(IStorable data, string keypass32) => Convert.ToBase64String(AESEncrypt(data.GetBytes(), keypass32));
  61. public static T ReadFromString<T>(string str, string keypass32) where T : IStorable, new() => AESDecrypt(Convert.FromBase64String(str), keypass32).ReadData<T>();
  62. static byte[] AESEncrypt(byte[] plainBytes, string Key)
  63. {
  64. MemoryStream mStream = new MemoryStream();
  65. RijndaelManaged aes = new RijndaelManaged();
  66. byte[] bKey = new byte[32];
  67. Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
  68. aes.Mode = CipherMode.ECB;
  69. aes.Padding = PaddingMode.PKCS7;
  70. aes.KeySize = 128;
  71. aes.Key = bKey;
  72. CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateEncryptor(), CryptoStreamMode.Write);
  73. try
  74. {
  75. cryptoStream.Write(plainBytes, 0, plainBytes.Length);
  76. cryptoStream.FlushFinalBlock();
  77. return mStream.ToArray();
  78. }
  79. finally
  80. {
  81. cryptoStream.Close();
  82. mStream.Close();
  83. aes.Clear();
  84. }
  85. }
  86. static byte[] AESDecrypt(byte[] encryptedBytes, string Key)
  87. {
  88. byte[] bKey = new byte[32];
  89. Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
  90. MemoryStream mStream = new MemoryStream(encryptedBytes);
  91. RijndaelManaged aes = new RijndaelManaged();
  92. aes.Mode = CipherMode.ECB;
  93. aes.Padding = PaddingMode.PKCS7;
  94. aes.KeySize = 128;
  95. aes.Key = bKey;
  96. CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateDecryptor(), CryptoStreamMode.Read);
  97. try
  98. {
  99. byte[] tmp = new byte[encryptedBytes.Length + 32];
  100. int len = cryptoStream.Read(tmp, 0, encryptedBytes.Length + 32);
  101. byte[] ret = new byte[len];
  102. Array.Copy(tmp, 0, ret, 0, len);
  103. return ret;
  104. }
  105. finally
  106. {
  107. cryptoStream.Close();
  108. mStream.Close();
  109. aes.Clear();
  110. }
  111. }
  112. public static MdType ReadFileWithMd_Md<MdType>(string readFrom) where MdType : IStorable, new()
  113. {
  114. FileStream reader = new FileStream(readFrom, FileMode.Open, FileAccess.Read);
  115. byte[] buff_md_p = new byte[4], buff_dat_p = new byte[4];
  116. reader.Read(buff_md_p, 0, 4);
  117. reader.Read(buff_dat_p, 0, 4);
  118. int md_p = BitConverter.ToInt32(buff_md_p, 0), dat_p = BitConverter.ToInt32(buff_dat_p, 0);
  119. byte[] buff_md = new byte[dat_p - md_p];
  120. reader.Position = md_p;
  121. reader.Read(buff_md, 0, buff_md.Length);
  122. reader.Close();
  123. return buff_md.ReadData<MdType>();
  124. }
  125. public static DataType ReadFileWithMd_Data<DataType>(string readFrom) where DataType : IStorable, new()
  126. {
  127. FileStream reader = new FileStream(readFrom, FileMode.Open, FileAccess.Read);
  128. byte[] buff_dat_p = new byte[4];
  129. reader.Position = 4;
  130. reader.Read(buff_dat_p, 0, 4);
  131. int dat_p = BitConverter.ToInt32(buff_dat_p, 0);
  132. reader.Position = dat_p;
  133. byte[] buff_data = new byte[reader.Length - dat_p];
  134. reader.Read(buff_data, 0, buff_data.Length);
  135. reader.Close();
  136. return buff_data.ReadData<DataType>();
  137. }
  138. /// <summary>
  139. /// 将此可序列化类型序列化并存入文件
  140. /// </summary>
  141. /// <param name="writeTo">文件路径</param>
  142. public static void WriteToFile(this IStorable data, string writeTo)
  143. {
  144. WriteFile(data, writeTo);
  145. }
  146. /// <summary>
  147. /// 从文件中读取并创建可序列化类型实例
  148. /// </summary>
  149. /// <param name="readFrom">文件路径</param>
  150. public static T ReadFile<T>(string readFrom) where T : IStorable, new()
  151. {
  152. if (!File.Exists(readFrom)) throw new FileNotFoundException();
  153. FileStream reader = new FileStream(readFrom, FileMode.Open, FileAccess.Read);
  154. byte[] data = new byte[reader.Length];
  155. reader.Read(data, 0, data.Length);
  156. reader.Close();
  157. DataStorage ds = new DataStorage(data);
  158. T instance = new T();
  159. instance.ReadFromData(ds);
  160. return instance;
  161. }
  162. }
  163. }