Сжатие Zlib в boost :: iostreams не совместимо с zlib.NET - PullRequest
3 голосов
/ 13 мая 2010

Я хочу отправить сжатые данные между моим C # в приложение C ++ в формате ZLIB. В C ++ я использую zlib_compressor / zlib_decompressor, доступный в boost :: iostreams. В C # я в настоящее время использую ZOutputStream, доступный в библиотеке zlib.NET. Прежде всего, когда я сжимаю одни и те же данные с использованием обеих библиотек, результаты выглядят по-разному:

  1. повышение :: iostreams :: zlib_compressor:

63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00

  1. zlib.NET (zlib.ZOutputStream):

78 9C 63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00 4F 31 63 8D

(Обратите внимание на шаблон 78 9C, который присутствует в zlib.NET, но отсутствует в boost).

Кроме того, когда я распаковываю данные в boost, которые я сжал в zlib.NET, я не могу читать из потока, предполагая, что что-то не так. Это работает, когда я пытаюсь распаковать данные, сжатые в boost.

Кто-нибудь знает, что идет не так?

Спасибо,

Юхан

Ответы [ 2 ]

3 голосов
/ 13 мая 2010

Это потому, что код boost :: iostreams :: zlib_compressor создает необработанные дефлированные данные, тогда как zlib.NET добавляет верхний и нижний колонтитулы, чтобы данные были в формате сжатия.

Для доказательства рассмотрите этот журнал сеанса Tcl:

% set s {78 9C 63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00 4F 31 63 8D}
78 9C 63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00 4F 31 63 8D
% set b [binary format H* [join $s ""]];string length $b
23
% zlib decompress $b
ðStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringString
% zlib inflate $b
data error
% set s {63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00}
63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00
% set b [binary format H* [join $s ""]];string length $b
17
% zlib decompress $b
data error
% zlib inflate $b
ðStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringString

(Команда zlib decompress расширяет данные в формате «сжатие», команда zlib inflate расширяет данные в формате «сырая дефляция».)

0 голосов
/ 13 мая 2010

Я не понял, почему zlib.NET не совместим с Boost iostreams, но я нашел решение: я сейчас использую DotNetZip (http://dotnetzip.codeplex.com/), и это прекрасно работает.

...