4

私は、ソフトウェアで Brotli 圧縮を使用すると、GZip を使用する現在のリリースよりもパフォーマンスが向上するかどうかを調査しているインターンです。

私の仕事は、GZip を使用して何かを変更し、代わりに Brotli 圧縮を使用することです。置き換える必要がある 1 つの関数は、GZip を使用して圧縮されたデータがバッファーに含まれているかどうかをテストするチェックを行います。これは、最初と最後でストリーム識別子をチェックすることによって行われます。

bool isGzipped() const
{
    // Gzip file signature (0x1f8b)
    return
        (_bufferEnd >= _bufferStart + 2) &&
        (static_cast<unsigned char>(_bufferStart[0]) == 0x1f) &&
        (static_cast<unsigned char>(_bufferStart[1]) == 0x8b);
}

同様の関数を作成したいbool isBrotliEncoded()。Brotliでエンコードされたバッファで実行できる同様のクイックチェックがあるかどうか疑問に思っていましたか? brotli が生成するいくつかの圧縮ファイルのバイト値を見てきましたが、それらすべてに当てはまるルールを見つけることができません。で始まるものもあれば0x5B、で始まるものもあり0x1B、空のファイルを0x06圧縮すると が生成され、複数回圧縮されたファイルはさまざまな値の範囲で始まります。各ファイルの末尾も矛盾しています。

正しい形式であるかどうかをテストする唯一の方法は、解凍を試みてエラーを待つことです。これでは、このテストを行う目的が無効になります。

私の質問は次のとおりです。解凍を試みて失敗を待つことなく、バッファーがBrotliで圧縮されているかどうかを確認する方法を知っている人はいますか?

4

2 に答える 2

9

残念ながら、生の brotli 形式は、単に解凍を試みてエラーを待つ場合でも、このような検出には適していません。

ランダム データの 100 万回の brotli 解凍の試行を実行しました。それらの約 5% が良い brotli ストリームとしてチェックアウトしました。だから、あなたはすでにそこに問題を抱えています。それぞれが有効な brotli ストリームである 9 つの 1 バイト値があるため、100 万の 3.5% が 1 バイトです。ランダムな有効なストリームの平均長は、ほぼ 1 メガバイトでした。

エラーが検出されたケース (100 万件の約 95%) では、エラーが検出される前に 3.5% が 1 メガバイトを超えていました。1.4% は 10 メガバイトを超えました。エラーが検出されるまでの平均ランダム バイト数は 309 KB でした。別の問題。

つまり、偽陽性の確率は比較的高く、陰性を見つけるために処理するバイト数は非常に大きくなる可能性があります。

このソフトウェアを作成している場合は、検出を支援するために、brotli データの前に独自のヘッダーを配置する必要があります。または、brotli 圧縮ストリームの前に一意の 4 バイト ヘッダーを持つ、彼らの要求に応じて開発した brotli フレーミング フォーマットを使用することもできます。これにより、誤検知の可能性が大幅に減少します。

于 2016-08-19T05:58:11.667 に答える