Код для сжатия / распаковки строки
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)
Предлагаемая версия предназначена для .NET 2.0, для .NET 4.0 используйте MemoryStream.CopyTo
.
ВАЖНО: Сжатое содержимое не может быть записано на выходпоток до тех пор, пока GZipStream
не узнает, что он имеет все входные данные (т. е. для эффективного сжатия ему нужны все данные).Вы должны убедиться, что вы Dispose()
из GZipStream
перед проверкой выходного потока (например, mso.ToArray()
).Это делается с помощью блока using() { }
выше.Обратите внимание, что GZipStream
является самым внутренним блоком, и доступ к содержимому осуществляется за его пределами.То же самое касается распаковки: Dispose()
из GZipStream
перед попыткой доступа к данным.