<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="148" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[148]</anchor-end> <dfn>DELFATE</dfn> は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮形式</anchor>の1つです。非常によく用いられています。</p><section><h1>仕様書</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="152" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[152]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">deflate<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">DEFLATE</title></anchor> は <dfn>RFC 1951</dfn> により定義されています。</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <strong><cite xml:lang="en">RFC 1951 - DEFLATE Compressed Data Format Specification version 1.3</cite> (<time>2016-01-10 18:30:17 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc1951">https://tools.ietf.org/html/rfc1951</anchor-external></strong><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <cite xml:lang="en">RFC 1951 - DEFLATE Compressed Data Format Specification version 1.3</cite> (<time>2016-01-10 18:30:17 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc1951#section-1">https://tools.ietf.org/html/rfc1951#section-1</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> <cite xml:lang="en">RFC 1951 - DEFLATE Compressed Data Format Specification version 1.3</cite> (<time>2016-07-03 09:57:20 +09:00</time>) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc1951#section-2">https://tools.ietf.org/html/rfc1951#section-2</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[26]</anchor-end> <cite xml:lang="en">RFC 1951 - DEFLATE Compressed Data Format Specification version 1.3</cite> (<time>2016-07-03 09:57:20 +09:00</time>) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc1951#section-3">https://tools.ietf.org/html/rfc1951#section-3</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="116" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[116]</anchor-end> <cite xml:lang="en">RFC 1951 - DEFLATE Compressed Data Format Specification version 1.3</cite> (<time>2017-09-17 17:36:41 +09:00</time>) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc1951#section-4">https://tools.ietf.org/html/rfc1951#section-4</anchor-external></li></ul></li></ul></refs></section><section><h1>データ形式</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="124" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[124]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 1591</anchor> は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮</anchor>された <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> データのことを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮データ集合</anchor>と呼んでおり、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮</anchor>の前の元のデータのことを<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">input data</rt></rubyb></dfn>
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src> と呼んでいます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> の処理において<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の連なり <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src>
と解釈されます。また<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮データ集合<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">compressed data set</rt></rubyb></dfn>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">系列</anchor>です <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src>。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>を処理したものが、
それぞれ順に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮データ集合</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>となります。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>圧縮器</anchor><rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">compressor</rt></rubyb>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様</anchor>にすべて従うデータ集合を生成しなければなりません <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal></src>。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>展開器</anchor><rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">decompressor</rt></rubyb>は、
特に定める場合を除き、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様</anchor>に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">適合</anchor>する任意のデータ集合を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">受理</anchor>し<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>展開</anchor><rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">decompress</rt></rubyb>できなければなりません。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal></src></p><section><h1>ビット列の表現</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="27" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[27]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> の出力は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>内の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット順</anchor>は規定されておらず <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src>、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラットフォーム</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコル</anchor>に依存します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="29" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[29]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">多バイト</anchor>の値は、重みの小さな<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>から順に並べた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">小エンディアン</anchor>) とします。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="28" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[28]</anchor-end> <rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">データ要素<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">data element</rt></rubyb>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>にする際には、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の重みの小さな<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LSB</anchor>) から順に詰めていきます。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="30" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[30]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン符号</anchor><em>以外</em>のデータ要素は、
当該データ要素の LSB から順に詰めていきます。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="31" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[31]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン符号</anchor>は、重みの大きな<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MSB</anchor>)
から順に詰めていきます。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p></section><section><h1>ブロック</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="62" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[62]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>の<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">block</rt></rubyb>の大きさは任意に決められますが、 
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">65535</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以下</anchor>でなければなりません。<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src>
圧縮器は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の最大長を制限できます。
しかし展開器は、任意の長さを扱えなければなりません。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="63" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[63]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮データ集合</anchor>の<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">block</rt></rubyb>は、
入力データの各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>に対応します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="66" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[66]</anchor-end> なお<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>境界と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>境界は一致しないかもしれません。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="64" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[64]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮データ集合</anchor>の各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>は、3ビットのヘッダーから始まります。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="65" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[65]</anchor-end> 第1ビット <dfn><var>BFINAL</var></dfn> は、
それが<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮データ集合</anchor>の最後の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>かどうかを表します。
ビットが設定されていれば、最後です。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="132" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[132]</anchor-end> 最終<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>後に更に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット列</anchor>が続く時、それをどう処理するべきかは、不明です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="67" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[67]</anchor-end> 第2ビットと第3ビットの <dfn><var>BTYPE</var></dfn> は、圧縮方法を表します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="142" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[142]</anchor-end> 展開器に与えられたデータが3ビットに満たない時、どう解釈するべきかは不明ですが、
壊れた入力と扱うのが自然でしょう。</p><section><h1>無圧縮ブロック</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="133" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[133]</anchor-end> <var>BTYPE</var> が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">00<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b00</attrvalue></n> の時、
無圧縮を表します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="134" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[134]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>を含む<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の残りの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット</anchor>は、あっても無視します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="135" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[135]</anchor-end> その次の2バイトは、 <code>LEN</code> と呼び、この<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>のデータのバイト数を表します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="136" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[136]</anchor-end> その次の2バイトは、<code>NLEN</code> と呼び、 <code>LEN</code> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1の補数</anchor>とします。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[137]</anchor-end> その次の <var>LEN</var> バイト分が、この<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル</anchor>データとします。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="138" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[138]</anchor-end> <var>LEN</var> と <var>NLEN</var> が整合しない時、どう処理するべきかは、不明です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="145" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[145]</anchor-end> 展開器に与えられたデータが指定された長さに満たない時、どう処理するべきかは不明です。</p></section><section><h1>圧縮ブロック</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="139" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[139]</anchor-end> <var>BTYPE</var> が
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">01<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b01</attrvalue></n> のとき、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">固定ハフマン符号</anchor>圧縮 (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="106" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;106</anchor-internal>) を表します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="140" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[140]</anchor-end> <var>BTYPE</var> が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">10<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b10</attrvalue></n> のとき、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">動的ハフマン符号</anchor>圧縮 (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="113" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;113</anchor-internal>) を表します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>圧縮されたデータ部分</anchor><rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">compressed data part</rt></rubyb></dfn>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要素</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">系列</anchor>です。各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要素</anchor>は、
<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラルバイト群<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">literal bytes</rt></rubyb>か、
<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">重複列への指示子<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">pointer to duplicated strings</rt></rubyb>かのいずれかです。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> 重複列への指示子は、
<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">length</rt></rubyb>と<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">前方向の距離<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">backward distance</rt></rubyb>との組です。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>は、 258 バイト<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以下</anchor>です。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離</anchor>は、 32KB <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以下</anchor>です。すなわち、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">指示子</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>の
32KB 前までの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">列<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">string</rt></rubyb>を参照できます。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src>
圧縮器は、より小さな距離を上限としても構いません。
しかし展開器は、 32KB まで処理できなければなりません。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="146" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[146]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">指示子</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の境界をまたがることができます
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src>。しかし<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>の先頭より前を指すことはできません <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src>。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>の先頭より前の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">指示子</anchor>が与えられた時、どう処理するべきかは不明です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="157" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[157]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離</anchor>の上限は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮</anchor>器や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">展開</anchor>器が探索のために保持しておかなければならない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バッファー</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リスト</anchor>
(<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="129" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;129</anchor-internal>) のサイズに影響します。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> を用いる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコル</anchor>は、
これを制限したり、制限を記述できたりする場合があります。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LZ77 sliding window</anchor> 参照。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>は、その<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル・長さ符号</anchor>により<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>します。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離</anchor>は、その<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離符号</anchor>により<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="147" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[147]</anchor-end> 不正な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>が現れたときにどう処理するべきかは不明です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> 各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン木</anchor>は、互いに独立です。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src></p></section><section><h1>予約</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="141" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[141]</anchor-end> <var>BTYPE</var> の値 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">11<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b11</attrvalue></n> は、予約 (誤り) とされています。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">11<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b11</attrvalue></n> が出現した時、これをどう処理するべきかは、不明です。</p></section></section><section><h1>ハフマン符号化</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="32" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[32]</anchor-end> <rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">接頭辞符号化<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">prefix coding</rt></rubyb>は、
事前に与えられた<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">字母<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">alphabet</rt></rubyb>の<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">記号<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">symbol</rt></rubyb>を、
ビット列 (符号) として表現するものです。ここで、ビット列は記号ごとに長さが異なりますが、
構文解析器が常に曖昧無く記号を認識できるようにします。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="33" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[33]</anchor-end> 接頭辞符号は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">二分木</anchor>を使って定義します。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">枝</anchor>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> または <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n> のいずれかを表すこととします。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">枝</anchor>がいずれかの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">記号</anchor>を表すこととします。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">根</anchor>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">葉</anchor>までの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">枝</anchor>の値を順番に並べたものが、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>を表します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="35" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[35]</anchor-end> 構文解析器は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">二分木</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">根</anchor>から順に入力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット</anchor>に従い進むことで、
記号を得ることができます。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="34" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[34]</anchor-end> 次の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">木</anchor>は、次の表のような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>を表しています。<pre>                          /\         
                         0  1        
                        /    \       
                       B     /\
                            0  1           
                           /    \          
                          A     /\
                               0  1
                              /    \
                             C      D</pre></p><table xmlns="http://www.w3.org/1999/xhtml"><tbody><tr><th> 記号</th><th> 符号</th></tr><tr><td>A</td><td><code>10</code></td></tr><tr><td>B</td><td><code>0</code></td></tr><tr><td>C</td><td><code>110</code></td></tr><tr><td>D</td><td><code>111</code></td></tr></tbody></table></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="36" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[36]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン算法</anchor>により、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">字母</anchor>とその<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">頻度</anchor>から最適な接頭辞符号を得られます。
頻度が高いほど身近な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>となります。これを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン符号</anchor>といいます。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="37" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[37]</anchor-end> ただし <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>長の上限があるので、少し複雑になります。 <src><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="38" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[38]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> では次の2つの制限があります <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src>。</p><figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="39" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[39]</anchor-end> ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット長</anchor>のすべての<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>は、
その表現する<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>記号</anchor><rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">symbol</rt></rubyb>と同じ順序で<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>辞書的</anchor><rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">lexicographically</rt></rubyb>に連続した値となっていること。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="40" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[40]</anchor-end> 短い<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>が、長い<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>よりも辞書的に前にあること。</li></ul></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="42" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[42]</anchor-end> この制限を設けることで、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">記号</anchor>に対応する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット長</anchor>
(<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号長<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">code length</rt></rubyb></dfn>) の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リスト</anchor>を示すだけで、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>を記述できます <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src>。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="41" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[41]</anchor-end> 先程の例 (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="34" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;34</anchor-internal>) では、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>は <code>0</code> &lt; <code>10</code> &lt; <code>110</code> = <code>111</code>
と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>の長さの順が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>の順序と一致しています (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="40" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;40</anchor-internal>)。
また C &lt; D と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">記号</anchor>の順序と同じ長さの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>の順序が一致しています。</p><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="43" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[43]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">記号</anchor>群 (A, B, C, D) を表すこの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>群は、
各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット長</anchor>から (2, 1, 3, 3) と表すことができます。
(この<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット長</anchor>の組によって表される<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>は一意に定まります。)</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="44" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[44]</anchor-end> <var>N</var> 個の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">記号</anchor>について、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号長</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リスト</anchor><var>長さ群</var>から、
対応する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>を <var>n</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">整数</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リスト</anchor>として得るには、
次のようにします。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="45" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[45]</anchor-end> <var>符号群</var>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空リスト</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="46" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[46]</anchor-end> <var>個数群</var>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空リスト</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="49" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[49]</anchor-end> [ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>, <var>n</var> ] の各<var>長さ</var>について、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="50" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[50]</anchor-end> <var>個数群</var> [ <var>長さ</var> ] を、 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="47" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[47]</anchor-end> <var>長さ群</var>の各<var>長さ</var>について、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="48" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[48]</anchor-end> <var>個数群</var> [ <var>長さ</var> ] を、 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インクリメント</anchor>します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="51" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[51]</anchor-end> <var>符号</var>を、 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="55" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[55]</anchor-end> <var>次符号群</var>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空リスト</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="52" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[52]</anchor-end> [ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n>, <var>n</var> ] の各<var>長さ</var>について、順に、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="53" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[53]</anchor-end> <var>符号</var>を、 (<var>符号</var> + <var>個数群</var> [ <var>長さ</var> - 1 ]) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&lt;&lt;</anchor> 1 に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="54" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[54]</anchor-end> <var>次符号群</var> [ <var>長さ</var> ] を、<var>符号</var>に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="56" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[56]</anchor-end> [ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>, <var>N</var> ] の各<var>記号</var>について、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="57" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[57]</anchor-end> <var>長さ</var>を、<var>長さ群</var> [ <var>記号</var> ] に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="58" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[58]</anchor-end> <var>長さ</var>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> 以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="59" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[59]</anchor-end> <var>符号群</var> [ <var>記号</var> ] を、<var>次符号群</var> [ <var>長さ</var> ] に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="60" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[60]</anchor-end> <var>次符号群</var> [ <var>長さ</var> ] を <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インクリメント</anchor>します。</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="61" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[61]</anchor-end> <var>符号群</var>を返します。</li></ol></figure></section><section><h1>ブロックで用いるハフマン符号の記号</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="102" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[102]</anchor-end> 符号化された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>では、2種類の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン符号</anchor>を使います。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="118" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[118]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン符号</anchor>は、
実際の各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>の直後に、
いくつかの<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">余剰ビット群<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">extra bits</rt></rubyb>が続く場合があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="101" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[101]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">余剰ビット群</anchor>は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MSB</anchor> から順に並べたものと解釈します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="117" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[117]</anchor-end> 1つ目の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン符号</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル</anchor><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor> (実際に表したいデータの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>)
や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>を表すもので、
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル・長さ符号<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">literal/length code</rt></rubyb></dfn> <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">字母</anchor>は
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル・長さ字母<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">literal/length alphabet</rt></rubyb></dfn> <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src>) 
のような呼ばれ方をしています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="103" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[103]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル・長さ符号</anchor>では、
次のように<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">記号</anchor>の意味を設定します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><figure class="list"><ul><li>[ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">255</n> ] - <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル</anchor>な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor></li><li><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">256</n> - <rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック末<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">end-of-block</rt></rubyb></li><li>[ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">257</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">285</n> ] - 長さ</li></ul></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="100" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[100]</anchor-end> 長さの指定の場合には、続く<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">余剰ビット群</anchor>によって実際の長さを求めます。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><figure><pre>                 Extra               Extra               Extra
            Code Bits Length(s) Code Bits Lengths   Code Bits Length(s)
            ---- ---- ------     ---- ---- -------   ---- ---- -------
             257   0     3       267   1   15,16     277   4   67-82
             258   0     4       268   1   17,18     278   4   83-98
             259   0     5       269   2   19-22     279   4   99-114
             260   0     6       270   2   23-26     280   4  115-130
             261   0     7       271   2   27-30     281   5  131-162
             262   0     8       272   2   31-34     282   5  163-194
             263   0     9       273   3   35-42     283   5  195-226
             264   0    10       274   3   43-50     284   5  227-257
             265   1  11,12      275   3   51-58     285   0    258
             266   1  13,14      276   3   59-66</pre></figure><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="119" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[119]</anchor-end> 2つ目の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン符号</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離</anchor>を表すものです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="104" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[104]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>でも、同様に余剰ビット群によって実際の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離</anchor>の値を求めます。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><figure><pre>                  Extra           Extra               Extra
             Code Bits Dist  Code Bits   Dist     Code Bits Distance
             ---- ---- ----  ---- ----  ------    ---- ---- --------
               0   0    1     10   4     33-48    20    9   1025-1536
               1   0    2     11   4     49-64    21    9   1537-2048
               2   0    3     12   5     65-96    22   10   2049-3072
               3   0    4     13   5     97-128   23   10   3073-4096
               4   1   5,6    14   6    129-192   24   11   4097-6144
               5   1   7,8    15   6    193-256   25   11   6145-8192
               6   2   9-12   16   7    257-384   26   12  8193-12288
               7   2  13-16   17   7    385-512   27   12 12289-16384
               8   3  17-24   18   8    513-768   28   13 16385-24576
               9   3  25-32   19   8   769-1024   29   13 24577-32768</pre></figure></section><section><h1>固定ハフマン符号</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="106" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[106]</anchor-end> <var>BTYPE</var> <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">01<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b01</attrvalue></n> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮されたデータ部分</anchor>は、
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">固定ハフマン符号<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">fixed Huffman code</rt></rubyb></dfn>を用いて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>したデータです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="120" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[120]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">固定ハフマン符号</anchor>ブロックの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル・長さ符号</anchor>は、
次のような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号長</anchor>の持つ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン符号</anchor>とします。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><ul><li>[ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">143</n> ] - 8ビット</li><li>[ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">144</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">255</n> ] - 9ビット</li><li>[ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">256</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">279</n> ] - 7ビット</li><li>[ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">280</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">287</n> ] - 8ビット</li></ul><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="107" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[107]</anchor-end> ただし、 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">286</n> と <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">287</n> は実際には使われません。 <src><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="108" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[108]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">固定ハフマン符号</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離符号</anchor> [ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">31</n> ] は、
そのまま5ビット固定長 (+ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">余剰ビット群</anchor>) で表します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="109" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[109]</anchor-end> <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">30</n> と <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">31</n> は実際には使われません。 <src><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮されたデータ部分</anchor>の末端は、 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">256</n> により表されます。
これが現れないで与えられたデータが終了した時<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">展開器</anchor>がどう処理するべきかは不明です。</p></section><section><h1>動的ハフマン符号</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="113" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[113]</anchor-end> <var>BTYPE</var> <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">10<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b10</attrvalue></n> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮されたデータ部分</anchor>は、
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">動的ハフマン符号<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">dynamic Huffman code</rt></rubyb></dfn>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン木</anchor>と、
それを用いて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>したデータです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="122" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[122]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">動的ハフマン符号</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>は、次のもので構成されます <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src>。</p><figure class="list members"><dl><dt>5ビット (<var>HLIT</var>)</dt><dd>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル・長さ符号</anchor>の数 - <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">257</n></dd><dt>5ビット (<var>HDIST</var>)</dt><dd>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離符号</anchor>の数 - <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n></dd><dt>4ビット (<var>HCLEN</var>)</dt><dd>
符号長符号の数 - <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">4</n></dd><dt>((<var>HCLEN</var> + 4) × 3) ビット</dt><dd>
符号長字母の符号長を 
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
の順に並べたもの。
各符号長は3ビット整数で表す。</dd><dt>(<var>HLIT</var> + <var>HDIST</var> + <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">258</n>) ビット</dt><dd>
次のもの:<figure class="list members"><dl><dt>(<var>HLIT</var> + <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">257</n>) ビット</dt><dd>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル・長さ符号</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">字母</anchor>ごとの符号長を並べたもの。</dd><dt>(<var>HDIST</var> + <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n>)</dt><dd>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離符号</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">字母</anchor>ごとの符号長を並べたもの。</dd></dl></figure><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号長符号</anchor>で符号化する。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル・長さ符号</anchor>部分と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離符号</anchor>部分の境界をまたがって<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>される場合もある。</dd><dt>任意長</dt><dd>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル・長さ符号</anchor>および<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離符号</anchor>により圧縮されたデータ
(末端は <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">256</n>)</dd></dl></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="123" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[123]</anchor-end> 使用する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン符号</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン木</anchor>は、
その<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号長</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リスト</anchor>として記述します。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号長</anchor>は、次の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">字母</anchor>を持つ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハフマン符号</anchor>
(<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号長符号<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">code length code</rt></rubyb></dfn>) によって記述します <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src>。</p><ul><li><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> - <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">15</n> : 符号長 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> - <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">15</n></li><li><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16</n> : 
前の符号長を、(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">余剰ビット群</anchor>2ビット + <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">3</n>) 回複製する<example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml">(<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">11<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b11</attrvalue></n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">10<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b10</attrvalue></n>) は、
(<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, 
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n>) を表します。</p></example></li><li><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">17</n> : 
符号長 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> を、 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">余剰ビット群</anchor>3ビット + <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">3</n>) 回繰り返す</li><li><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">18</n> :
符号長 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> を、 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">余剰ビット群</anchor>7ビット + <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">10</n>) 回繰り返す</li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="114" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[114]</anchor-end> ここで、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号長</anchor> <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> は、
該当する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">記号</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">字母</anchor>に現れないため、
ハフマン符号構築アルゴリズムで省くべきことを示します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="115" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[115]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">距離符号</anchor>が1つだけしか使われない場合には、
1ビットのみを使って符号化し、
0ビットは使いません。
この場合、符号長が1つと未使用の符号が1つとなります。
0ビットの符号1つの場合は、距離符号を使わない (すべてのデータがリテラルである)
ことを表します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">展開器</anchor>に与えられたデータが記述された長さと矛盾する時、
どう処理するべきかは不明です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="121" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[121]</anchor-end> 末端に <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">256</n> が現れないで与えられたデータが終了した時<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">展開器</anchor>がどう処理するべきかは不明です。</p></section></section><section><h1>辞書</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="149" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[149]</anchor-end> 入出力データの先頭に「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">preset dictionary</anchor>」を置くことが <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> では想定されており
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src>、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">zlib</anchor> では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応用</anchor>次第で利用できることになっています。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">preset dictionary</anchor> は、出現頻度の高いデータを予め送受信者間で共有することで、
指示子によって参照できるようにするものです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="150" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[150]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮器</anchor>は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">preset dictionary</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>の初期状態として処理を開始し、
本来の無圧縮データをその続きの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>として用います。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="151" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[151]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">展開器</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">preset dictionary</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>を復号済みの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>の初期状態として処理を開始し、
復号済み<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">入力データ</anchor>のその続きの部分に本来の無圧縮データを得ます。</p></section><section><h1>継続</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="158" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[158]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket</anchor> <code>permessage-deflate</code> では、
連続した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メッセージ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">WebSocketメッセージ</title></anchor>の送信で前の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メッセージ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">WebSocketメッセージ</title></anchor>の
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LZ77移動窓</anchor>を再利用することができ、
これを <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">use context takeover</anchor> と呼んでいます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="159" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[159]</anchor-end> 直前の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メッセージ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">WebSocketメッセージ</title></anchor>を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">preset dictionary</anchor>
として用いるようなものとも言えます。</p></section><section><h1>符号化 (圧縮)</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="127" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[127]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 1951</anchor> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> データ形式を定義していますが、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮アルゴリズム</anchor>自体は定めないこととしています。
しかし <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> 形式は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LZ77</anchor> により<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">圧縮</anchor>することを想定したものであり、
<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">強く推奨<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">strongly recommended</rt></rubyb>される、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">特許</anchor>問題が無いと考えられる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">算法</anchor>が示されています。
もちろん、それ以外の方法により生成することも認められています。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="116" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;116</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="128" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[128]</anchor-end> 圧縮器は、
新しいハフマン木が有用と考えられる時や、
ブロックサイズが圧縮木のブロックバッファーの末尾に達した時、
ブロックを終えます。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="116" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;116</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="129" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[129]</anchor-end> 圧縮器は、
重複する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>を探すため、
3バイトの列に対する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハッシュ関数</anchor>を使った<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">連鎖ハッシュ表<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">chained hash table</rt></rubyb>を使います。
入力の次の3バイトがハッシュ表にあれば、
該当するハッシュ鎖のすべての文字列のうち最長一致のものを選択します。
ハッシュ表にない場合は、リテラルバイトとしてそのまま出力します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="116" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;116</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="130" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[130]</anchor-end> ハッシュ鎖の探索では、距離を小さくするため、直近の文字列から探していきます。
ハッシュ鎖はどんどん<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">連結</anchor>していき、削除はしませんが、
古すぎるものは一致しても採用しません。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="116" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;116</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="131" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[131]</anchor-end> 圧縮器は、
一致したものの選択を遅延させても構いません (lazy matching)。
ある位置で一致しても、更に先でより長い一致があるなら、そちらを使うことにできます。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="116" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;116</anchor-internal></src></p></section><section><h1>復号 (展開)</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="68" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[68]</anchor-end> <var>入力ストリーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>は、次のようにします。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal></src>
ただし、<var>入力ストリーム</var>から読むとは、現在位置から指定された長さのビット列を返し、
現在位置をその次のビットまで進めることをいいます。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="74" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[74]</anchor-end> <var>出力</var>を、空バイト列に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="90" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[90]</anchor-end> 繰り返し、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="69" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[69]</anchor-end> <var>BFINAL</var> を、<var>入力ストリーム</var>から1ビット読んだ結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="70" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[70]</anchor-end> <var>BTYPE</var> を、<var>入力ストリーム</var>から2ビット読んだ結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="92" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[92]</anchor-end> <var>BTYPE</var> が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">11<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b11</attrvalue></n> なら、<ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"></ed></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="71" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[71]</anchor-end> <var>BTYPE</var> が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">00<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b00</attrvalue></n> なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="72" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[72]</anchor-end> <var>入力ストリーム</var>の現在の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の残りの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット</anchor>をすべて読みます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="73" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[73]</anchor-end> <var>LEN</var> と <var>NLEN</var> を得ます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="75" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[75]</anchor-end> <var>入力ストリーム</var>から <var>LEN</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>読んだ結果を、
<var>出力</var>の末尾に追加します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="76" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[76]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="77" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[77]</anchor-end> <var>BTYPE</var> が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">10<sub xmlns="http://www.w3.org/1999/xhtml">2</sub><attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">0b10</attrvalue></n> の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="78" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[78]</anchor-end> <var>符号</var>を、符号木の表現を読んだ結果に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="125" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[125]</anchor-end> それ以外の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="126" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[126]</anchor-end> <var>符号</var>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">固定ハフマン符号</anchor>に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="79" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[79]</anchor-end> 繰り返し、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="80" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[80]</anchor-end> <var>値</var>を、<var>入力ストリーム</var>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リテラル</anchor>と長さの値を復号した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="81" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[81]</anchor-end> <var>値</var> &lt; <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">256</n> なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="82" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[82]</anchor-end> <var>出力</var>の末尾に<var>値</var>を追加します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="83" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[83]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="84" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[84]</anchor-end> <var>値</var> = <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">256</n> (end of block) なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="85" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[85]</anchor-end> 繰り返し (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="79" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;79</anchor-internal>) を終えます。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="86" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[86]</anchor-end> それ以外なら [ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">257</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">285</n> ]、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="87" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[87]</anchor-end> <var>入力ストリーム</var>から距離を復号します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="93" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[93]</anchor-end> <var>位置</var>を、<var>出力</var>の長さ - <var>距離</var>に設定します。</li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="94" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[94]</anchor-end> <var xmlns="http://www.w3.org/1999/xhtml">位置</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">負</anchor>の時、...</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="95" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[95]</anchor-end> 繰り返し、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="98" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[98]</anchor-end> <var>出力</var> [ <var>位置</var> ] を、<var>出力</var>の末尾に追加します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="99" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[99]</anchor-end> <var>位置</var>を <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インクリメント</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="88" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[88]</anchor-end> <var>距離</var>を <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">デクリメント</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="96" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[96]</anchor-end> <var>距離</var>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="97" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[97]</anchor-end> 繰り返し (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="95" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;95</anchor-internal>) を終えます。</li></ol></li></ol></li></ol></li></ol></li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="89" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[89]</anchor-end> <var>BFINAL</var> が設定されていれば、繰り返し (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="90" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;90</anchor-internal>) を終えます。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="91" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[91]</anchor-end> <var>出力</var>を返します。</li></ol></figure></section><section><h1>文脈</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> は次の場面で用いられています。</p><figure class="short list"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="154" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[154]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応用</anchor></figcaption><ul><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">zlib</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gzip</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIP</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LHA</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">zip</code> (JWE)</anchor> の値 <dfn><code>DEF</code></dfn> <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;160</anchor-internal>, <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="161" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;161</anchor-internal></src></li></ul></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="153" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[153]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">zlib</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gzip</anchor> は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> に簡単に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ラップ</anchor>した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">データ形式</anchor>です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">zlib</anchor> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メモリー</anchor>上や通信での利用を想定した短いヘッダーと高速な整合性検査を採用しており、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gzip</anchor> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイル</anchor>としての利用を想定した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メタデータ</anchor>を格納できるようになっています
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="155" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;155</anchor-internal></src>。</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="155" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[155]</anchor-end> <cite>Frequently Asked Questions about <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">zlib</anchor></cite> (<time>2005-02-21 07:10:26 +09:00</time>) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.gzip.org/zlib/zlib_faq.html#faq19">http://www.gzip.org/zlib/zlib_faq.html#faq19</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[160]</anchor-end> <cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 7518</anchor> - JSON Web Algorithms (JWA)</cite>, <time>2019-11-27 04:11:14 +09:00</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc7518#section-7.3">https://tools.ietf.org/html/rfc7518#section-7.3</anchor-external></li><li>
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="161" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[161]</anchor-end> 
<cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 7516</anchor> - JSON Web Encryption (JWE)</cite>, <time>2022-11-23T08:22:47.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://datatracker.ietf.org/doc/html/rfc7516#section-4.1.3">https://datatracker.ietf.org/doc/html/rfc7516#section-4.1.3</anchor-external></li></ul></refs></section><section><h1>関連</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor> <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">deflate</anchor></code>
については、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">zlib</anchor> を参照。</p></section><section><h1>歴史</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFLATE</anchor> は <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 1591</anchor></dfn> によって定義されています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 1591</anchor> は第1.3版となっていますが、第1.1版から技術的内容は変わっていません <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal></src>。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> 第1.0版には言及がなく、存在したのか不明です。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="105" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[105]</anchor-end> 当時としては一般的なスタイルの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>ですが、現代的には読みづらく厳密さが足りないといえます。
細部の規定が不十分だったり、似て非なる用語が (おそらく意図せず) 混在していたり、
同じことを異なる表現で解説しているだけなのか、別個の規定なのかはっきりしない似た記述が複数存在したり。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite xml:lang="en">RFC 6713 - The 'application/zlib' and 'application/gzip' Media Types</cite>
(<time>2015-09-27 13:20:11 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc6713">https://tools.ietf.org/html/rfc6713</anchor-external></p><figure class="quote"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <cite>zlib 入門</cite>
(<time>2007-02-14 08:49:05 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://oku.edu.mie-u.ac.jp/~okumura/compression/zlib.html">https://oku.edu.mie-u.ac.jp/~okumura/compression/zlib.html</anchor-external></figcaption><blockquote><p>zlib の圧縮アルゴリズムは PKZIP 2.x の deflate アルゴリズムで, もともとは私と吉崎栄泰さんが LHA のために開発したものをハッシュで高速化したものです(zlib のソースコード中に,ほんのちょっとですが私の名前が入っています)。 その後,LHA もハッシュを使うようになりましたので,LHA と gzip/zlib/Zip の実質的な相違はなくなりました。</p></blockquote></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> <cite xml:lang="en-US">Efficient XML Interchange (EXI) Format 1.0</cite>
( (<time>2011-03-10 23:00:15 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.w3.org/TR/2011/REC-exi-20110310/#CompressedStreams">http://www.w3.org/TR/2011/REC-exi-20110310/#CompressedStreams</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="112" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[112]</anchor-end> <cite xml:lang="en">RFC 8054 - Network News Transfer Protocol (NNTP) Extension for Compression</cite>
(<time>2017-01-28 00:54:34 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc8054">https://tools.ietf.org/html/rfc8054</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="156" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[156]</anchor-end> <cite>An Explanation of the DEFLATE Algorithm</cite>
(<time>2002-04-14 04:20:49 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.gzip.org/deflate.html">http://www.gzip.org/deflate.html</anchor-external></p></section></body></html>