LZ4 неправильно сжимает строки

Недавно я попытался интегрировать сжатие данных без потерь в свой игровой движок для загрузки ресурсов; но этот простой пример сжатия похоже, работает неправильно. Какие-либо предложения ? Вот мой код:

 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

РЕДАКТИРОВАТЬ При распаковке данных отображается только часть "Привет": остальные символы являются случайными/без символов

EDIT 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;

person MattMatt    schedule 24.02.2016    source источник
comment
Вы не должны печатать двоичные данные в виде текста.   -  person MikeCAT    schedule 24.02.2016
comment
Разве сжатая строка не должна быть читаемой?   -  person NathanOliver    schedule 24.02.2016
comment
Я не должен; но при распаковке данных верна только часть «Привет»   -  person MattMatt    schedule 24.02.2016
comment
Остальное рандомно/ без символов   -  person MattMatt    schedule 24.02.2016
comment
@MattMatt Вы пытались запустить свой код под отладчиком?   -  person Algirdas Preidžius    schedule 24.02.2016
comment
Почему бы вам не проверить распакованные данные?   -  person Simon Kraemer    schedule 24.02.2016
comment
Я пытался запустить его под отладчиком (VS15)   -  person MattMatt    schedule 24.02.2016
comment
Распакованные данные неверны (записаны в файл в двоичном формате)   -  person MattMatt    schedule 24.02.2016
comment
Сделаю еще правку и выложу полученные бинарники   -  person MattMatt    schedule 24.02.2016
comment
Как вы распаковываете данные? С библиотекой не знаком, а функции для финализации сжатия нет?   -  person MikeCAT    schedule 24.02.2016
comment
@MattMatt И .. Вы прошлись по своему коду, чтобы увидеть, все ли значения переменных соответствуют вашим ожиданиям?   -  person Algirdas Preidžius    schedule 24.02.2016
comment
Я не думаю, что есть; Я только начал пользоваться библиотекой, поэтому пользуюсь документацией   -  person MattMatt    schedule 24.02.2016
comment
Я не думаю, что const int dstBufferSize = LZ4_compressBound(sizeof(srcData)); правильно. sizeof(srcData) скорее всего 4 или 8.   -  person Simon Kraemer    schedule 24.02.2016
comment
@SimonKraemer Kraemer LZ4_compressBound — это функция LZ4, которая дает максимальный размер сжатых данных в соответствии с размером источника; почему бы не использовать sizeof(srcData)? Значение dstBuffer равно 20, поэтому места должно быть достаточно.   -  person MattMatt    schedule 24.02.2016
comment
@SimonKraemer Это должен быть ответ.   -  person NathanOliver    schedule 24.02.2016
comment
Потому что sizeof(srcData) - это размер указателя на вашу строку, а не длина строки.   -  person user2807083    schedule 24.02.2016
comment
так что я должен написать вместо этого? Количество символов?   -  person MattMatt    schedule 24.02.2016


Ответы (1)


Вы используете sizeof(srcData), который даст вам размер указателя, а не данных, на которые он указывает.

Вместо этого вы должны использовать strlen(srcData)+1 (+1 вместо \0).

Или используйте std::string и std::string::size() (также с +1 для нулевого терминатора).

person Simon Kraemer    schedule 24.02.2016
comment
Ok; но теперь я получаю это: @Привет! ═════════════════════════²²²² - person MattMatt; 24.02.2016
comment
после распаковки строки я получаю: Привет! без остальной части строки - person MattMatt; 24.02.2016
comment
Вы знаете, что использовали неправильный размер в двух позициях кода? LZ4_compressBound и LZ4_compress_default - person Simon Kraemer; 24.02.2016