0

最近、アセットをロードするために、損失の少ないデータ圧縮をゲーム エンジンに統合しようとしました。しかし、この単純な圧縮の例は正しく機能していないようです。助言がありますか ?これが私のコードです:

 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

編集 データを解凍すると、「Hi」部分のみが表示されます:残りはランダムな文字/文字なしです

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

1 に答える 1

3

これを使用sizeof(srcData)すると、ポインターが指すデータではなく、ポインターのサイズが得られます。

代わりに使用する必要がありますstrlen(srcData)+1( の場合は +1 \0)。

または、and を使用std::stringしますstd::string::size()(ヌル ターミネータには +1 も使用します)。

于 2016-02-24T15:14:53.533 に答える