Недавно я попытался интегрировать без потерь сжатие данных на мой игровой движок для загрузки активов; но это простой пример сжатия похоже не работает правильно. Какие-либо предложения ? Вот мой код:
const char *srcData = "Hi ! This is a really really really long test string !";
const int dstBufferSize = LZ4_compressBound(sizeof(srcData));
char *dstData = new char[dstBufferSize];
int bytesPassed = LZ4_compress_default(srcData, dstData,
sizeof(srcData),
dstBufferSize); // compress data
BOOST_LOG_TRIVIAL(info) << dstData << std::endl; // print compressed data
delete[] dstData;
Это выход. Очевидно, вы видите, что это неправильно (часть строки отсутствует):
[2016-02-24 15:56:47.986366] [0x00000b0c] [info] @Hi !═══════════════²²²²À▀WÏÇ0
РЕДАКТИРОВАТЬ
При распаковке данных появляется только часть «Привет»: остальные — случайные символы / без символов
РЕДАКТИРОВАТЬ 2 После предложения Саймона я изменил код; но после распаковки кода; я только получаю Привет! (ничего после него); Вот обновленный код:
const char *srcData = "Hi ! This is a really really really long test string !";
const int dstBufferSize = LZ4_compressBound(strlen(srcData) + 1);
char *dstData = new char[dstBufferSize];
int bytesPassed = LZ4_compress_default(srcData, dstData,
sizeof(srcData),
dstBufferSize);
BOOST_LOG_TRIVIAL(info) << dstData << std::endl;
std::ofstream fWriter("test.bin", std::ofstream::binary);
fWriter << dstData;
fWriter.close();
char* decStr = new char[strlen(srcData) + 1];
LZ4_decompress_fast(dstData, decStr, strlen(srcData) + 1);
std::cout << decStr << std::endl; // only Hi appearing
delete[] dstData;
Ты используешь sizeof(srcData)
который даст вам размер указателя, а не данных, на которые он указывает.
Вы должны использовать strlen(srcData)+1
вместо (+1 для \0
).
Или использовать std::string
а также std::string::size()
(Также с +1 для нулевого терминатора).
Других решений пока нет …