3

これは Google にとって信じられないほど難しい質問でした。私は gzip や Zip や deflate を探しているわけではありません。使用したいアルゴリズムは「圧縮」と呼ばれますが、それは一般的に圧縮を実装しようとしているという意味ではありません。特定のアルゴリズムを探しています。

compressUnix ライクなシステムのコマンド ライン ツールで使用される適応型 Lempel-Ziv アルゴリズムを探しています。Content-Encoding: compressヘッダーを受信したときに使用する必要があると HTTP が言うアルゴリズムを探しています。man compressこれは、POSIX シェルで入力したときに説明されているアルゴリズムであり、このウィキペディアの記事.

この圧縮アルゴリズムは非常に古く、ほとんどすべての実用的な目的で gzip、Zip、deflate などに置き換えられていることを理解しています。しかし、私はペット プロジェクトとして C++ でサーバーを作成しており、IANA はこの Unix の「圧縮」アルゴリズムを、すべてのサーバーがサポートすべきエンコーディングの 1 つとして指定しています。

このcompressユーティリティは、長い間 (POSIX の前から) Unix シェルの一部であり、標準の C 言語実装がないとは信じられません。への呼び出しを使用したり、シェルで圧縮を実行したりすることもできますが(別のプロセスを作成する...うーん)、アルゴリズムを実行可能ファイルにコンパイルするよりもはるかに効率的ではありません。systemexec

このアルゴリズムの標準 C 実装/ライブラリはありますか?

4

4 に答える 4

1

私はいくつかの良い参考文献を見つけたと思います:

最初に、Lempel-Ziv に基づく圧縮の Free BSD 実装を示します: https://www.freebsd.org/security/advisories/FreeBSD-SA-11:04.compress.asc

ここここに、Lempel-Ziv アルゴリズムの修正版があります (著者の中には、Spencer W. Thomas がいます)。

新しい実装

DOS移植

FREE BSD に基づくAppleバージョン。

ヒント: 引用された「compress.c」を検索してください。

于 2015-12-19T10:33:30.840 に答える
1

確かに Linux では、システム ライブラリlibarchiveがcompressで使用される LZW をサポートしています。

ライブラリには独自のプロジェクト ページがあり、その意味で移植性がありますが、すべての POSIX システムではないにしても、他のシステムで使用されていることは間違いありません。おそらくman libarchive を試してみてください。

于 2015-12-19T11:02:41.217 に答える
1

圧縮転送を解凍するためにここunlzw()に書いた関数を見つけることができます。Content-Encoding:

ただし、http に準拠するために圧縮をサポートする必要はありません。圧縮方法はネゴシエーションであり、圧縮を受け入れると言わない (クライアントの場合) か、クライアントが圧縮を受け入れたときに圧縮を配信しない (サーバーの場合) ことができます。「すべてのサーバーが圧縮エンコーディングをサポートする必要がある」というのは正しくありません。

于 2015-12-19T14:44:07.063 に答える