のサイズを取得しされた、圧縮解除されたデータzlib?
-
06-09-2019 - |
質問
私をつくるということを含むファイルのアップロードサービスの種類は、データ圧縮zlibの圧縮がなくなります。を送りたいので、インターネットで圧縮されかを知る必要があり、非圧縮ファイルサイズのリモートサーバーです。が今お付き合いをしているギャラリこの情報ョ()グのデータをサーバーの初、英語、ドイツ語で行われます。るようになっているので、そのショートカットにプレイしていただければと思いれば点は入ると信じていました。
のように"というネーミングの由来をョ?るそうひどい思っていましたところに解凍に...
解決
のzlibフォーマットは、元の入力サイズのフィールドを持っていないので、私はあなたがデータの解凍をシミュレートすることなく、それを行うことができるようになります疑います。 GZIPフォーマットには、 "入力サイズ"(ISIZE
)を有していますフィールドは、あなたが使用できることが、多分あなたは圧縮形式を変更したり、ファイルサイズを送信するクライアントを持つ避けたい。
しかし、あなたは別の形式を使用する場合でも、あなたはクライアントを信頼していない場合、あなたはまだ非圧縮データは、クライアントは、それがあると言う大きさであることを確認するために、より高価なチェックを実行する必要があります。この場合は、何を行うことができますすることにすることです。の解凍・ツーを/ dev / null のプロセス安価、あなただけ知ってほしいと、どこにでも出力データを書き込まないことを確認のzlibを作ります非圧縮サイズます。
他のヒント
かりではないように思えます。ありえないものに裏付zlib図書館の提供からメモリするのが意味するものではないが7または8年使ったので、最新のdocsいなかったのでしょうかを示すこの機能が追加された).
一つの可能性が転送別のファイルの圧縮解除時のサイズ(例えば、どちらも乗り換え file.zip
や file.zip.size
でもそういう危険である場合は特に、サイズを取得します。
他のインタビューを受けたことがある場合、サーバー uncompressingは時に高価なものとなり急いで優先度の低いバックグラウンドタスクとなっているため、この nice
下Linuxで共通)。が、ある点の場合はサイズをチェックを行後も多くの遊びに来ます。
いい"と思われているようです。減圧の急減圧を作りましたが、どうせなら良い期間の利用:-)
、あなたはアップロードされているのデータのサイズに関する情報を持っています。パックスは、この点で正しいです。
あなたは、圧縮バッファの先頭に4バイトのヘッダとしてそれを保存することができます - ファイルサイズが4ギガバイトを超えていないと仮定し
。
一例として、いくつかのCコード:
uint8_t *compressBuffer = calloc(bufsize + sizeof (uLongf), 0);
uLongf compressedSize = bufsize;
*((uLongf *)compressBuffer) = filesize;
compress(compressBuffer + sizeof (uLongf), &compressedSize, sourceBuffer, bufsize);
次に、あなたのサイズcompressedSize +はsizeof(uLongf)の完全なcompressBufferを送ります。あなたは、サーバー側でそれを受け取った場合、あなたが戻ってデータを取得するために、次のコードを使用することができます:
// data is in compressBuffer, assume you already know compressed size.
uLongf originalSize = *((uLongf *)compressBuffer);
uint8_t *realCompressBuffer = compressBuffer + sizeof (uLongf);
あなたは正しいサイズを送信するために、クライアントを信頼していない場合は、あなたは、サーバーのサイズに圧縮されていないデータチェックのいくつかの並べ替えを実行する必要があります。 / dev / nullに解凍を使用しての提案は妥当なものです。
あなたは.zipファイルをアップロードする場合は、それが解凍いたときにあなたのファイルのサイズを指示するディレクトリが含まれています。これは、悪意のあるクライアントの対象ですが、この情報は、再び、ファイル形式に組み込まれています。