November 27, 2006

Compression and Decompression (Using ICSharpCode.SharpZipLib)

Code to compress and Decompress data using ICSharpCode Zip Libs

using System;
using System.IO;
using System.Text;
using ICSharpCode.SharpZipLib;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;


///
/// Decompress String
///

/// String To Decompress
/// Decompressed String
internal static string DeCompressString(string stringToDecompress) {
MemoryStream memoryStream = null;
ZipInputStream zipInputStream = null;
MemoryStream memoryStream2 = null;
ZipEntry entry = null;
BinaryReader binaryReader = null;
byte[] retByte = null;
try{
memoryStream = new MemoryStream(Convert.FromBase64String (stringToDecompress));
zipInputStream = new ZipInputStream(memoryStream);
memoryStream2 = new MemoryStream();
entry = zipInputStream.GetNextEntry();
if (entry != null) {
byte[] data = new byte[4096];
while (true) {
int size = zipInputStream.Read(data, 0, data.Length);
if (size > 0) {
memoryStream2.Write(data, 0, size);
}
else {
break;
}
}
binaryReader = new BinaryReader(memoryStream2);
retByte = new byte[memoryStream2.Length];
memoryStream2.Seek(0, SeekOrigin.Begin);
binaryReader.Read(retByte, 0, (int)memoryStream2.Length);
}
}
finally{
entry = null;
zipInputStream.Close();
zipInputStream = null;
binaryReader.Close();
binaryReader = null;
memoryStream2.Close();
memoryStream2 = null;
memoryStream.Close();
memoryStream = null;
}
return Encoding.ASCII.GetString(retByte);
}
///
/// Compresses String
///

/// String to Compress
/// Base64 compressed string
internal static string CompressString(string stringToCompress) {
byte [] input = Encoding.ASCII.GetBytes(stringToCompress);
MemoryStream memoryStream = null;
ZipOutputStream zip = null;
ZipEntry entry = null;
byte[] retByte = null;
try{
memoryStream = new MemoryStream();
zip = new ZipOutputStream(memoryStream);
Crc32 crc = new Crc32();
zip.SetLevel(9); // 0..9.
entry = new ZipEntry("CZE");
entry.DateTime = DateTime.Now;
entry.Size = input.Length;
crc.Reset();
crc.Update(input);
entry.Crc = crc.Value;
zip.PutNextEntry(entry);
zip.Write(input, 0, input.Length);
zip.Finish();
retByte = new byte[memoryStream.Length];
memoryStream.Seek(0, SeekOrigin.Begin);
memoryStream.Read(retByte, 0, retByte.Length);
}
finally{
zip.Close();
zip = null;
entry = null;
memoryStream.Close();
memoryStream = null;
}
return Convert.ToBase64String(retByte);
}