2016-12-27 35 views
1

私はLZ4 compressor C libを使用しています。私が圧縮するファイルの中には、JPGとPNGがあります。私が理解できない何らかの理由で、このメソッドは、私が圧縮している画像(またはゼロ)に対して負の値を返すことがあります。LZ4:圧縮画像フォーマットの圧縮

たとえば、2つの標準JPG画像を圧縮しています。 1つは値 '-236'を返し、2番目のバイトは圧縮されたバイト数を返します。これは最初のバイトが圧縮に失敗したことを意味します。ゼロ復帰は、LZ4が圧縮に失敗したことを意味します。 -236が何を意味するのか分かりません。ソースデータがすでにある程度圧縮されているからでしょうか?

+4

私は圧縮されたバージョンがオリジナルよりも実際に大きくなっていると思います(これはJPEGでは珍しくなく、JPEG画像を圧縮して自分自身で結果を確認しようとします)。 – kuruczgyurci

+0

247行目の後にexampled @ https://github.com/lz4/lz4/blob/dev/examples/compress_functions.cをチェックしましたか?つまりmaxcompsizeの使用 – HRgiger

+0

私はこの関数が得られたバイト数を返したと考えました圧縮(original_size - compressed_size)が、私は間違っていたようです。 _return:バッファ 'dest'に書き込まれたバイト数(必然的に<= maxOutputSize) または圧縮が失敗した場合は0です。負の値は言及していないようです。 – kuruczgyurci

答えて

4

関数の戻り値の定義は次のとおりです。

return : the number of bytes written into buffer 'dest' (necessarily <= maxOutputSize) 
      or 0 if compression fails 

圧縮がすでに圧縮ファイルを使用している可能性が高いuncompressedSizeよりも大きなサイズになった場合、この関数は失敗します。しかし、それはなぜそれが負の値を返したのかを説明していない - それは文書化されていない。しかし、圧縮されたファイルを扱う必要がある場合は、より大きなバッファを用意することでファイルサイズを大きくする必要があります。 op < dest場合、コードを見て、どのように見るのは難しいですが、ポインタ演算は、負の値を返します

return (int) (((char*)op)-dest); 

source codeを見ると、戻り値がでLZ4_compress_generic()で生成され

発生する可能性があります。問題がある場合は、問題が解決しない場合は、デバッガのコードをステップバイステップで実行することをお勧めします。

+1

const size_t max_dst_size = LZ4_compressBound(src_size);問題を解決する –