我是.net的新手。我在 C# 中做压缩和解压缩字符串。有一个 XML,我正在转换为字符串,然后我进行压缩和解压缩。我的代码中没有编译错误,除非我解压缩代码并返回我的字符串,它只返回 XML 的一半。
以下是我的代码,请纠正我的错误。
代码:
class Program { public static string Zip(string value) { //Transform string into byte[] byte[] byteArray = new byte[value.Length]; int indexBA = 0; foreach (char item in value.ToCharArray()) { byteArray[indexBA++] = (byte)item; } //Prepare for compress System.IO.MemoryStream ms = new System.IO.MemoryStream(); System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress); //Compress sw.Write(byteArray, 0, byteArray.Length); //Close, DO NOT FLUSH cause bytes will go missing... sw.Close(); //Transform byte[] zip data to string byteArray = ms.ToArray(); System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length); foreach (byte item in byteArray) { sB.Append((char)item); } ms.Close(); sw.Dispose(); ms.Dispose(); return sB.ToString(); } public static string UnZip(string value) { //Transform string into byte[] byte[] byteArray = new byte[value.Length]; int indexBA = 0; foreach (char item in value.ToCharArray()) { byteArray[indexBA++] = (byte)item; } //Prepare for decompress System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray); System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress); //Reset variable to collect uncompressed result byteArray = new byte[byteArray.Length]; //Decompress int rByte = sr.Read(byteArray, 0, byteArray.Length); //Transform byte[] unzip data to string System.Text.StringBuilder sB = new System.Text.StringBuilder(rByte); //Read the number of bytes GZipStream red and do not a for each bytes in //resultByteArray; for (int i = 0; i < rByte; i++) { sB.Append((char)byteArray[i]); } sr.Close(); ms.Close(); sr.Dispose(); ms.Dispose(); return sB.ToString(); } static void Main(string[] args) { XDocument doc = XDocument.Load(@"D:\RSP.xml"); string val = doc.ToString(SaveOptions.DisableFormatting); val = Zip(val); val = UnZip(val); } }
我的 XML 大小是 63KB。
压缩/解压缩字符串的代码
public static void CopyTo(Stream src, Stream dest) { byte[] bytes = new byte[4096]; int cnt; while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0) { dest.Write(bytes, 0, cnt); } } public static byte[] Zip(string str) { var bytes = Encoding.UTF8.GetBytes(str); using (var msi = new MemoryStream(bytes)) using (var mso = new MemoryStream()) { using (var gs = new GZipStream(mso, CompressionMode.Compress)) { //msi.CopyTo(gs); CopyTo(msi, gs); } return mso.ToArray(); } } public static string Unzip(byte[] bytes) { using (var msi = new MemoryStream(bytes)) using (var mso = new MemoryStream()) { using (var gs = new GZipStream(msi, CompressionMode.Decompress)) { //gs.CopyTo(mso); CopyTo(gs, mso); } return Encoding.UTF8.GetString(mso.ToArray()); } } static void Main(string[] args) { byte[] r1 = Zip("StringStringStringStringStringStringStringStringStringStringStringStringStringString"); string r2 = Unzip(r1); }
请记住,Zip返回 a byte[],而Unzip返回 a string。如果你想要一个字符串,Zip你可以对它进行 Base64 编码(例如使用Convert.ToBase64String(r1))(结果Zip是非常二进制的!它不是你可以打印到屏幕上或直接写在 XML 中的东西)
Zip
byte[]
Unzip
string
Convert.ToBase64String(r1)
建议的版本适用于 .NET 2.0,对于 .NET 4.0,使用MemoryStream.CopyTo.
MemoryStream.CopyTo
重要提示:GZipStream在知道它具有所有输入之前(即,要有效压缩它需要所有数据),压缩内容才能写入输出流。在检查输出流(例如,)之前,您需要确保您Dispose()的身份。这是通过上面的块完成的。请注意,这是最里面的块,并且可以在其外部访问内容。解压缩也是如此:在尝试访问数据之前。GZipStream``mso.ToArray()``using() { }``GZipStream``Dispose()``GZipStream
GZipStream
Dispose()
GZipStream``mso.ToArray()``using() { }``GZipStream``Dispose()``GZipStream