2016-06-15 4 views
1

Мне нужна кросс-платформенная компрессия/декомпрессия между Windows и Ubuntu. Насколько я понимаю, начиная с .NET 4.5, класс DeflateStream использует zlib в качестве библиотек сжатия. Я написал две небольшие тестовые программы для сжатия данных: одну в C#, запущенную в Windows, а другую в «C», запущенную на Ubuntu. Платформа .NET - 4.5.2..NET DeflateStream vs linux zlib разница

C# код использует CompressionLevel.Optimal

код С помощью Z_BEST_COMPRESSION

Вот результаты:

Input bytes: {9, 12, 13} 
C# output: {227, 228, 225, 5, 0}; 
C output: {120, 218, 227, 228, 225, 5, 0, 0, 67, 0, 35} 

Как вы можете видеть, длина сжатых данных в C# является 5 байты, где в C - 11 байтов. Кажется, что 'C' zlib добавляет 2 дополнительных байта в заголовке и 4 дополнительных байта в нижнем колонтитуле.

При необходимости я могу предоставить общий доступ к коду. Тем не менее, это взято из стандартных примеров, которые вы видите в сети, и нет ничего особенного в коде.

Я что-то не хватает? Есть ли способ исправить это? Если заголовок и нижний колонтитул всегда остаются неизменными, возможно, я всегда могу добавить дополнительные байты. С уважением.

ответ

3

Во-первых, вам нужно понять, что есть три возможных формата, которые может генерировать zlib. Они являются сырым дефлятом (RFC 1951), потоком zlib, который является сырым дефлатом, обернутым в заголовок zlib и трейлер (RFC 1950), и поток gzip, который является сырым дефлятом, обернутым в заголовок и трейлер gzip (RFC 1952). Ваш код C# генерирует поток необработанного потока, в то время как ваш код C генерирует поток zlib.

Вы не указали свой код, но можете легко использовать zlib (в своем коде C) для создания потока сыпучего дефлята, как это делает DeflateStream. К сожалению, в NET 4.5 нет класса для создания потока zlib (в вашем коде C#). Однако вы можете легко создать свой собственный заголовок zlib и трейлер, чтобы обернуть поток необработанного потока. (См. RFC.)

Однако я бы очень рекомендовал, чтобы вы вообще не использовали подпрограммы интерфейса NET 4.5 zlib. Вместо этого используйте DotNetZip, который предоставляет интерфейс для полной функциональности zlib и т. Д., И, самое главное, не имеет ошибок, как в NET 4.5, что Microsoft заявила, что они will not fix!

Смежные вопросы