//http://sb2extensions.codeplex.com/
//Apache License 2.0 (Apache)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
namespace Sb2.Extensions
{
public static class CompressionExtensions
{
/// <summary>
/// Compresses the specified data.
/// </summary>
/// <param name="data">The data.</param>
/// <returns></returns>
public static byte[] Compress(this byte[] data)
{
using (MemoryStream output = new MemoryStream())
{
using (DeflateStream def = new DeflateStream(output, CompressionMode.Compress))
{
def.Write(data, 0, data.Length);
}
return output.ToArray();
}
}
/// <summary>
/// Decompresses the specified data.
/// </summary>
/// <param name="data">The data.</param>
/// <returns></returns>
public static byte[] Decompress(this byte[] data)
{
using (MemoryStream input = new MemoryStream())
{
input.Write(data, 0, data.Length);
input.Position = 0;
using (DeflateStream def = new DeflateStream(input, CompressionMode.Decompress))
{
using (MemoryStream output = new MemoryStream())
{
byte[] buff = new byte[64];
int read = -1;
read = def.Read(buff, 0, buff.Length);
while (read > 0)
{
output.Write(buff, 0, read);
read = def.Read(buff, 0, buff.Length);
}
def.Close();
return output.ToArray();
}
}
}
}
/// <summary>
/// Compresses the specified data.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data">The data.</param>
/// <returns></returns>
public static byte[] Compress<T>(this T data)
{
byte[] result = null;
using (MemoryStream ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, data);
result = Compress(ms.ToArray());
}
return result;
}
/// <summary>
/// Decompresses the specified compressed data.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="compressedData">The compressed data.</param>
/// <returns></returns>
public static T Decompress<T>(this byte[] compressedData) where T : class
{
T result = null;
var formatter = new BinaryFormatter();
byte[] decompressed = Decompress(compressedData);
using (MemoryStream ms = new MemoryStream(decompressed))
{
result = formatter.Deserialize(ms) as T;
}
return result;
}
}
}
|