1

RFC を読み、c および JavaScript の実装を確認した後でも、インフレート アルゴリズムがどのように機能するかを理解するのに苦労しています。テキスト「TestingTesting」を含むファイルを圧縮すると、16 進数で次の結果が得られました: 0B 49 2D 2E C9 CC 4B 0F 81 50 00

16 ビットと 32 ビットのエンディアン スワップ後にデータを読み取ろうとしましたが、最初の 3 ビットを読み取った後、次の 5 ビットが意味をなさないため、それ以上取得できません。私は何を間違っていますか?これをどのように解析できますか?

私が使用した参考文献: RFC 1951 Javascript C

4

1 に答える 1

12

コンプレッサーからの出力は、バイトのストリームです。なぜエンディアンスワップを行うのですか?

最初の数バイトをバイナリとして見ると、次のようになります。

0B  = 00001011
49  = 01001001
2D  = 00101101  
2E  = 00101110
...

RFC のセクション 3.1.1 から:

  • ビットは右から左に読み取られるため、ヘッダーの最初のビット は次のようになりBFINALます1

     00001011
            ^
    
  • 数値は LSB ファーストでパックされ、右から左に読み取られるため、次のようになりBTYPEます01

     00001011
          ^^
    
  • これは固定のハフマン コード ブロック タイプなので、次はハフマン コードを期待します。ハフマン コードは MSB ファーストでパックされるため、最初のコードは次のよう10000100になります (ここで次のバイトに進みます)。

     00001011
     ^^^^^
     01001001
          ^^^
    
  • セクション 3.2.6 の表を見ると、リテラル バイト 0 ~ 14300110000を表すため、 (= ) は" " の ASCII コードであるリテラル値です。10111111100001000x840x54T

  • 続いて、次のコードは10010101(= ) で、これは " "0x95というリテラル値です。0x65e

...等々。

于 2011-09-12T20:32:51.107 に答える