Сжатие строк с использованием 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) ? "Массивы равны" : "Ошибка");
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д