Сжатие строк с использованием GZipStream - C#
Формулировка задачи:
Вот тут приведены примеры по сжатию строк с использованием GZipStream. Я попытался сделать по аналогии расширяющий метод для string. Вот его реализация:
Пример использования:
Но не работает декомпрессия - ошибка с магическим числом, что не так?
static class StringExtension
{
public static string GZipCompress(this string s, CompressionMode mode, Encoding encoding)
{
if (mode == CompressionMode.Compress)
{
using (var outputStream = new MemoryStream())
{
using (var compressionStream = new GZipStream(outputStream, mode))
{
using (var inputStream = new MemoryStream(encoding.GetBytes(s)))
{
inputStream.CopyTo(compressionStream);
}
}
return encoding.GetString(outputStream.ToArray());
}
}
else
{
using (var inputStream = new MemoryStream(encoding.GetBytes(s)))
{
using (var compressionStream = new GZipStream(inputStream, mode))
{
using (var outputStream = new MemoryStream())
{
compressionStream.CopyTo(outputStream);
return encoding.GetString(outputStream.ToArray());
}
}
}
}
}
} static void Main()
{
var encoding = new UTF8Encoding();
string sourceText = "“ ... ”";
string compressedText = sourceText.GZipCompress(CompressionMode.Compress, encoding);
string decompressedText = compressedText.GZipCompress(CompressionMode.Decompress, encoding);
}compressionStream.CopyTo(outputStream);
Неправильное магическое число в заголовке GZip. Передача должна идти в поток GZip.
Решение задачи: «Сжатие строк с использованием GZipStream»
textual
Листинг программы
byte[] buf1 = new byte[]{0x1f, 0x8b}; // GZip magic bytes
string s = encoding.GetString(buf1);
byte[] buf2 = encoding.GetBytes(s);
Console.WriteLine(buf1.SequenceEqual(buf2) ? "Массивы равны" : "Ошибка");