Как распаковать сжатый поток с помощью java.util.zip.Deflater в .NET?

У меня есть дамп после java.util.zip.Deflater (можно подтвердить, что он действителен, потому что Java Inflater открывает его нормально), и мне нужно открыть его в .NET:

byte[] content = ReadSample(sampleName);
var input = new MemoryStream(content);
var output = new MemoryStream();

using (var z = new System.IO.Compression.DeflateStream(input, CompressionMode.Decompress, true))
        z.CopyTo(output);

Это бросает

System.IO.InvalidDataException: длина блока не соответствует его дополнению.

Пробовал Ionic.Zlib.DeflateStream - аналогичное исключение. Как я могу это сделать?

Дамп начинается с 97 86 E8 92 47 3D 40 EA (если это имеет значение).

Обновление: К сожалению, я не могу контролировать Java-партию, так как система находится в производстве.


person UserControl    schedule 13.12.2011    source источник


Ответы (3)


Поскольку у вас нет контроля над выводом Java, как насчет интеграции J# в ваше приложение .NET, чтобы напрямую использовать java.util.zip.Inflater? См. эту статью MSDN.

Этот аналогичный вопрос также может быть полезен, особенно предложение #zipLib.

person Esoteric Screen Name    schedule 13.12.2011

Чтобы разрешить использование сжатия и распаковки в зависимости от платформы

Подход-1

В .NET вы можете использовать System.IO.Compression.GZipStream

В Java используйте java.util.zip.GZIPOutPutStream

Подход-2

Вы также можете использовать 7-zip. Существует SDK как для c#, так и для Java.

person Sunil Kumar Sahoo    schedule 13.12.2011
comment
Мне повезло использовать Ionic.Zlib.GZipStream для сжатия в С#, а затем GZIPInputStream в Java для распаковки. Спасибо за ваше предложение :) - person Mazrick; 17.09.2014

Я не верю, что Deflater и Inflater являются стандартными форматами, и я был бы удивлен, если бы они были одинаковыми в Java и C#.

Я бы посоветовал вам использовать стандартный формат, такой как GZIP, который должен быть одинаковым на разных платформах.

person Peter Lawrey    schedule 13.12.2011
comment
-1 Весь смысл Deflater/Inflater (на Java или C#) заключается в предоставлении высокоуровневого API для библиотеки zlib, которая также реализует GZIP. - person Sulthan; 21.05.2013