我是.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返回byte[],而Unzip返回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