C# 数据压缩与还原

public static byte[] Compress(byte[] src)
{
	if (null == src)
	{
		return null;
	}

	using (var ms = new MemoryStream())
	{
		using (GZipStream gs = new GZipStream(ms, System.IO.Compression.CompressionMode.Compress))
		{
			gs.Write(src, 0, src.Length);
		}

		return ms.ToArray();
	}
}

public static void Decompress(byte[] src, ref byte[] dist)
{
	if (null == src || null == dist)
	{
		return;
	}

	using (var ms = new MemoryStream(src))
	{
		using (GZipStream gs = new GZipStream(ms, System.IO.Compression.CompressionMode.Decompress))
		{
			int iread = gs.Read(dist, 0, dist.Length);
		}
	}
}

MSDN 上提供了标准示例:

public static void Compress(DirectoryInfo directorySelected)
{

	foreach (FileInfo file in directorySelected.GetFiles("*.xml"))
	using (FileStream originalFileStream = file.OpenRead())
	{
		if ((File.GetAttributes(file.FullName) & FileAttributes.Hidden)
			!= FileAttributes.Hidden & file.Extension != ".cmp")
		{
			using (FileStream compressedFileStream = File.Create(file.FullName + ".cmp"))
			{
				using (DeflateStream compressionStream = new DeflateStream(compressedFileStream, CompressionMode.Compress))
				{
					originalFileStream.CopyTo(compressionStream);
				}
			}

			FileInfo info = new FileInfo(directoryPath + "\\" + file.Name + ".cmp");
			Console.WriteLine("Compressed {0} from {1} to {2} bytes.", file.Name, file.Length, info.Length);
		}
	}
}

public static void Decompress(FileInfo fileToDecompress)
{
	using (FileStream originalFileStream = fileToDecompress.OpenRead())
	{
		string currentFileName = fileToDecompress.FullName;
		string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);

		using (FileStream decompressedFileStream = File.Create(newFileName))
		{
			using (DeflateStream decompressionStream = new DeflateStream(originalFileStream, CompressionMode.Decompress))
			{
				decompressionStream.CopyTo(decompressedFileStream);
				Console.WriteLine("Decompressed: {0}", fileToDecompress.Name);
			}
		}
	}
}

事实上使用 DeflateStream 可以达到比 GzipStream 更好的压缩效果,因为它们使用了不同的压缩算法,但是,只能处理未压缩的数据;

GzipStream 支持保存成 gz 格式的压缩文件,而 DeflateStream 不支持保存成压缩文件; 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值