Я ищу обертку командной строки для ВЫКАЧИВАТЬ алгоритма.
У меня есть файл (блоб мерзавца), который сжат с помощью, ВЫКАЧИВАЮТ, и я хочу распаковать его. Команда gzip, кажется, не имеет опцию непосредственно использовать ВЫКАЧИВАТЬ алгоритм, а не gzip формат.
Идеально я ищу стандартный инструмент Unix/Linux, который может сделать это.
править: Это - вывод, который я получаю при попытке использовать gzip для моей проблемы:
$ cat .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 | gunzip
gzip: stdin: not in gzip format
UPDATE: Марк Адлер заметил, что git blobs - это не сырые DEFLATE-потоки, а zlib-потоки. Их можно распаковать с помощью pigz
, который поставляется в нескольких дистрибутивах Linux:
$ cat foo.txt
file foo.txt!
$ git ls-files -s foo.txt
100644 7a79fc625cac65001fb127f468847ab93b5f8b19 0 foo.txt
$ pigz -d < .git/objects/7a/79fc625cac65001fb127f468847ab93b5f8b19
blob 14file foo.txt!
Мой первоначальный ответ, сохраненный по историческим причинам:
Если я правильно понял подсказку в статье Wikipedia, упомянутой Марком ван Кемпеном, вы можете использовать puff.c
из zlib напрямую.
Вот небольшой пример:
#include <assert.h>
#include <string.h>
#include "puff.h"
int main( int argc, char **argv ) {
unsigned char dest[ 5 ];
unsigned long destlen = 4;
const unsigned char *source = "\x4B\x2C\x4E\x49\x03\x00";
unsigned long sourcelen = 6;
assert( puff( dest, &destlen, source, &sourcelen ) == 0 );
dest[ 4 ] = '\0';
assert( strcmp( dest, "asdf" ) == 0 );
}
Почему бы вам просто не использовать инструменты git для доступа к данным? Он должен иметь возможность читать любой объект git:
git show --pretty=raw <object SHA-1>
См. http://en.wikipedia.org/wiki/DEFLATE#Encoder_implementations
Он перечисляет ряд программных реализаций, включая gzip, так что они должны работать. Вы пробовали просто запустить gzip для файла? Не распознает ли формат автоматически?
Как узнать, что формат сжат с помощью DEFLATE? Какой инструмент использовался для сжатия файла?
Необработанное содержимое, включая заголовок «$ type $ length \ 0», напечатает что-то вроде следующего:
perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' \
< .git/objects/27/de0a1dd5a89a94990618632967a1c86a82d577