0

別のテキスト ファイル内に、ソース テキストとそのおそらく zlib 圧縮された埋め込み (および \ エスケープ) があります。\0、\t、\n、\r、引用符などの公称エスケープでzlibを使用する以外に、エンコーディングに関するドキュメントはありません。

エスケープされていないデータには次のものがあります。

最初の 4 バイト: 1A 9B 02 00 最後の 4 バイト: 76 18 23 82

これは、無効なヘッダーがあると不平を言うインフレです。

1.2.5 を使用して一致するソース テキストを自分で収縮/膨張させると、次のようになります。

最初の 4 バイト: 78 9C ED 7D

ヘッダー バイトを指定して、どの圧縮が使用されているかを誰かが提案できますか? 実際にそれらを使用するマジック ナンバーやヘッダー式は見つかりませんでした。

編集:ここに関連ファイルがあります...

  • codedreadbase.cohdemo は、BASE 動詞の後にエスケープされた埋め込みセクションを含むソース テキスト ファイルです。エスケープは次のとおりです。

    \n = (改行) \r = (リターン) \0 = 0 (NULL) \t = タブ \q = " \s = ' \d = $ \p = %

  • codedreadbase.deflated は、二重引用符内で上記を unescpaing した後、zlib inflateInit/inflate*/inflateEnd に渡すものです。

  • codedreadbase.txt は、埋め込みセクションの元のテキストです。
4

1 に答える 1

1

最初の 4 バイト1A 9B 02 00は、圧縮されていないデータの長さをリトル エンディアン順で表したもので、10 進数で 170778 です。次の 4 バイトで有効な zlib ストリームの開始を実際に見つけました: 78 5E ED 7D. エスケープされた形式からバイナリ圧縮ストリームを適切に抽出する必要があるだけです。私は問題なく、 codedreadbase.txt を正確に解凍しました。

バックスラッシュ自体である明らかなエスケープについては言及していません。 \\に行く必要があり\ます。多分それはあなたが見逃しているものです。C のこの単純な un-escaper は機能しました。

#include <stdio.h>

int main(void)
{
    int ch;

    while ((ch = getchar()) != EOF) {
        if (ch == '\\') {
            ch = getchar();
            if (ch == EOF)
                break;
            ch =
                ch == 'n' ? '\n' :
                ch == 'r' ? '\r' :
                ch == '0' ? 0 :
                ch == 't' ? '\t' :
                ch == 'q' ? '"' :
                ch == 's' ? '\'' :
                ch == 'd' ? '$' :
                ch == 'p' ? '%' : ch;
        }
        putchar(ch);
    }
    return 0;
}
于 2013-01-20T17:11:10.993 に答える