2013-07-21 2 views
3

В Ruby у меня есть буфер, содержащий данные, сжатые с помощью метода zlib compress2(). Однако я не нашел возможности распаковать эти данные, используя функциональность Zlib в стандартной библиотеке Ruby, которая поддерживает только данные, созданные deflate, или данные в формате GZip.Ruby: uncompress zlib-wrapped deflate data

Как достичь эквивалента uncompress() в Ruby, желательно, не прибегая к созданию пользовательского C-расширения?

Редактировать:

Я нашел решение. После безуспешной работы с аргументом window_bits конструктору Inflate я наконец понял, что zlib префикс сжатых данных четырехбайтным заголовком. Так что я просто удалены, что заголовок и вдруг он работал как шарм:

data[0..3] = '' 
    data = Zlib::Inflate.inflate(data) 

ответ

0

The documentation указывает, что рубин раздувать класс распаковывает выход compress2(), который находится в формате ZLIB. Я просто попробовал, и все отлично. Ваши сжатые данные не могут привести к тому, что Ruby останется нетронутым.

+0

Спасибо, что подтвердили, что она действительно поддерживается. Я не мог заставить класс «Inflate» работать без изменения моих входных данных, но было очень полезно знать, что он должен работать :) –

1

Необходимо использовать отрицательное значение для window_bits, как указано here. Я столкнулся с подобной проблемой, но для сжатия на Ruby и декомпрессии на JS (my gist for that). Надеюсь, это поможет избежать магии с четырьмя укусами :)