#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 сработало.
Спасибо, Шон.