ОБНОВЛЕНИЕ: Марк Адлер отметил, что git-объекты - это не необработанные потоки 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!
Мой первоначальный ответ, сохраненный по историческим причинам:
Если я понимаю подсказку в статье Википедии , упомянутой Марком ван Кемпеном, вы можете использовать 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 );
}