Декодирование вывода LZ4 из iOS сжатия_encode_buffer

У меня есть приложение для iOS, сжимающее кучу маленьких кусочков данных. Я использую compress_encode_buffer, работающий в режиме LZ4, чтобы сделать это достаточно быстрым для моих нужд.

Позже я беру файлы, которые я сделал, и декодирую их на устройстве не от Apple. Ранее я использовал их режим сжатия ZLIB и мог успешно декодировать его в C# с помощью System.IO.Compression.DeflateStream.

Тем не менее, у меня чертовски много времени с выходом LZ4. Основываясь на документации LZ4, Apple разбивает поток на несколько блоков, каждый из которых начинается с 4-байтового магического числа, 4-байтового распакованного размера и 4-байтового сжатого размера. Все это имеет смысл, и я могу разобрать файл в его фрагменты raw-LZ4. Каждый блок в буфере вывода iOS распаковывает до 65 635 байт, и в моем случае их около 10.

Но потом: я понятия не имею, что делать с кусками LZ4, с которыми я остался. Я попытался расшифровать их с помощью LZ4.LZ4Stream от LZ4net, LZ4.LZ4Codec от LZ4net (он управляет первым блоком, но затем завершается ошибкой, когда я подаю второй блок). Я также попробовал несколько библиотек C++ для декодирования данных. Кажется, что каждый из них ищет заголовок, который функции сжатия iOS закодировали нестандартным способом.

1 ответ

Решение

Отвечая на мой собственный: декомпрессор Apple LZ4 (с необходимыми изменениями для обработки их необработанного формата хранения) находится здесь: https://opensource.apple.com/source/xnu/xnu-3789.21.4/osfmk/vm/lz4.c.auto.html

Отредактируйте потом: на самом деле я не смог заставить это работать, но я не тратил много времени на это, потому что нашел декомпрессор LZFSE от Apple.

Декомпрессор LZFSE можно найти здесь: https://github.com/lzfse/lzfse

Другие вопросы по тегам