Почему использование библиотеки lz4 для распаковки данных терпит неудачу, но отлично работает при использовании unlz4?

#c #lz4

#c #lz4

Вопрос:

Я пишу некоторый код для распаковки буфера, закодированного в LZ4. При вызове происходит сбой операции LZ4_decompress_safe . Выдается ошибка ‘ERROR_contentChecksumFlag_invalid’. С входными данными все в порядке, потому что я записал тот же буфер в файл и использовал unlz4 для его декодирования. Нормально. Версия библиотеки lz4-dev, которую я использую, — 1.7.1 (для Ubuntu Pkg).

Библиотека lz4, которую использует unlz4, 1.7.1. Я не понимаю, в чем проблема.

Код, который я использую:

 std::ofstream dbgfile("~/lz4_dbg", std::ios::out | std::ios::binary);
dbgfile.write(entry_buffer, entry_size);
dbgfile.close();

char* lz4_buffer = (char*)calloc(1, entry_size*4);
uint64_t bytes_decompressed = LZ4_decompress_safe(entry_buffer, lz4_buffer, entry_size, entry_size * 4); 

std::string err = LZ4F_getErrorName(bytes_decompressed);
  

Комментарии:

1. Где вы проверяете наличие ошибок в этом коде?

2. Последняя строка. LZ4F_getErrorName(bytes_decompressed) . LZ4_decompress_safe возвращает -4.

3. LZ4_decompress_safe() возвращает значение int, но вы сохраняете его в uint64_t , а затем используете LZ4F_ функцию для этого? Это кажется неправильным? И были ли ваши данные сжаты с помощью функций LZ4 или LZ4F? Я сомневаюсь, что эти два понятия совместимы.

4. Я хранил его в int, но подумал попробовать uint64_t для шуток и хихиканья. Повторный запуск с помощью int64_t приводит к тому же результату ошибки. Я не уверен, с помощью каких функций он был сжат. Это данные из Интернета. Я могу попробовать и сообщить об этом.

Ответ №1:

Итак, проблема заключалась в том, что я просто не был знаком с библиотекой lz4 и не понимал, что существует два разных способа распаковки данных lz4 (через LZ4 или LZ4Framing).

Использование обычного LZ4 завершилось неудачей, но переключение на LZ4Framing сработало.

Спасибо, Шон.