9

私はLZ4ライブラリを使用しており、データを解凍するときに

int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize);

解凍後の最大データサイズを見積もりたい。しかし、私はの逆関数を見つけることができません

int LZ4_compressBound(int isize);

maxDecompressedSizeこれにより、解凍関数の最後のパラメーターに提供する解凍データの上限を決定できます。

たとえば、snappyなどの他の圧縮ライブラリは、そのような機能を提供します。

bool GetUncompressedLength(Source* source, uint32* result);

初期データ サイズ (圧縮前) を保存する機能がない場合、および割り当てる必要があるバッファーのサイズについて悲観的になりたくない場合はどうすればよいですか?

4

2 に答える 2

8

LZ4 の最大圧縮率は 255 であるため、圧縮解除されたデータ サイズの保証された過大評価は、入力サイズの 255 倍です。

これは明らかに多すぎて実際には役に立たないため、「逆 LZ4_compressBound()」関数が利用できないのはそのためです。

残念ながら、圧縮されていないサイズを保存するか、知る以外に方法はありません。最適な選択はアプリケーション固有であるため、LZ4 の「生の」圧縮形式では、このような情報を保存する方法が定義されていません。たとえば、一部のアプリケーションは 16KB を超えるブロックがないことを事前に知っているため、LZ4_decompress_safe() を呼び出すときに maxDecompressedSize = 16 KB を使用できます。

現在、そのような責任を負うエンベロープ形式を探している場合は、独自のカスタム形式を作成するか、LZ4 Framing 形式を使用できます: http://fastcompression.blogspot.fr/2013/04/lz4- streaming-format-final.html (ソース パッケージ内に LZ4_Framing_Format.html としても存在します)。残念ながら、この形式を生成して読み取ることができるライブラリは、現在ベータ段階にあります ( https://github.com/Cyan4973/lz4/tree/frame )

于 2014-09-09T19:04:34.853 に答える