(57)【要約】【課題】データ復元の高速化を可能とする。【解決手段】データ圧縮装置２の探索手段２ａは、圧縮対象のデータ１を、データ１内の記号の配列を調査し、先に出現した第１の記号列１ａと記号の配列が一致する第２の記号列１ｂを探索する。データ圧縮装置２の符号化手段２ｂは、第１の記号列１ａの先頭の記号が属するブロックを特定する情報を含む符号に、第２の記号列１ｂを符号化する。データ復元装置４の符号取得手段４ａは、圧縮データ３ａの先頭から順に、符号を取得する。データ復元装置４の復元手段４ｂは、第２の記号列１ｂの符号を取得した場合には、第１の記号列１ａの先頭の記号が属するブロックを特定する情報に基づいて、記憶手段５から、復元された第１の記号列１ａの先頭の記号が属するブロック以降の１以上のブロックを取得し、第２の記号列１ｂを復元する。【選択図】図１
2014183551.tif 000002
【特許請求の範囲】
【請求項１】
圧縮対象のデータを、２以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査し、先に出現した第１の記号列と記号の配列が一致する第２の記号列を探索する探索手段と、
前記第１の記号列の先頭の記号が属するブロックを特定する情報を含む符号を生成し、前記第２の記号列を該符号に符号化する符号化手段と、
を有するデータ圧縮装置。
【請求項２】
前記符号化手段は、前記第１の記号列の先頭の記号が属するブロックのアドレスと、前記第２の記号列の先頭の記号が属するブロックのアドレスとの差分を、前記第１の記号列の先頭の記号が属するブロックを特定する情報とする、
ことを特徴とする請求項１記載のデータ圧縮装置。
【請求項３】
前記符号化手段は、前記第１の記号列の先頭の記号のブロック内での位置と、前記第２の記号列の先頭の記号のブロック内での位置とのずれ量を、前記第２の記号列の符号に含めることを特徴とする請求項１または２記載のデータ圧縮装置。
【請求項４】
前記符号化手段は、前記第２の記号列の先頭の記号が属するブロックのアドレスと、前記第２の記号列の最後の記号が属するブロックのアドレスとの差分を、前記第２の記号列の符号に含めることを特徴とする請求項１乃至３のいずれかに記載のデータ圧縮装置。
【請求項５】
前記符号化手段は、前記第２の記号列の最後の記号が属するブロックの先頭から、該ブロック内での該最後の記号の位置までの差分を、前記第２の記号列の符号に含めることを特徴とする請求項１乃至４のいずれかに記載のデータ圧縮装置。
【請求項６】
前記符号化手段は、先に調査した範囲に記号の配列が一致する記号列がない第３の記号列に基づいて、一致する記号列がないことを示す情報を含む符号を生成し、前記第２の記号列の符号、前記第３の記号列の符号、および前記第３の記号列のコピーを含む圧縮データを生成することを特徴とする請求項１乃至５のいずれかに記載のデータ圧縮装置。
【請求項７】
前記符号化手段は、前記第３の記号列の先頭の記号の、前記データのブロック内での位置と、前記圧縮データを複数のブロックに分けたときの、前記第３の記号列のコピーの先頭の記号の、前記圧縮データのブロック内での位置との差分を、前記第３の記号列の符号に含める、
ことを特徴とする請求項６記載のデータ圧縮装置。
【請求項８】
前記符号化手段は、前記第３の記号列の先頭の記号が属するブロックのアドレスと、前記第３の記号列の最後の記号が属するブロックのアドレスとの差分を、前記第３の記号列の符号に含めることを特徴とする請求項６または７記載のデータ圧縮装置。
【請求項９】
前記符号化手段は、前記第３の記号列の最後の記号が属するブロックの先頭から、該ブロック内での該最後の記号の位置までの差分を、前記第３の記号列の符号に含めることを特徴とする請求項６乃至８のいずれかに記載のデータ圧縮装置。
【請求項１０】
前記符号化手段は、前記圧縮データを複数のブロックに分け、符号と前記第３の記号列のコピーとを、異なるブロックに格納することを特徴とする請求項６乃至９のいずれかに記載のデータ圧縮装置。
【請求項１１】
圧縮対象のデータを、２以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査した場合に、先に出現した第１の記号列と記号の配列が一致する第２の記号列が、前記第１の記号列の先頭の記号が属するブロックを特定する情報を含む符号に符号化された圧縮データの先頭から順に、符号を取得する符号取得手段と、
取得した符号から順に元の記号列に復元して、復元した記号列をブロック単位で記憶手段に格納し、前記第２の記号列の符号を取得した場合には、前記第１の記号列の先頭の記号が属するブロックを特定する情報に基づいて、前記記憶手段から、復元された前記第１の記号列の先頭の記号が属するブロック以降の１以上のブロックを取得し、該１以上のブロックから前記第１の記号列をコピーして、前記第２の記号列を復元する復元手段と、
を有するデータ復元装置。
【請求項１２】
前記圧縮データにおける前記第２の記号列の符号には、前記第１の記号列の先頭の記号が属するブロックを特定する情報として、前記第１の記号列の先頭の記号が属するブロックのアドレスと、前記第２の記号列の先頭の記号が属するブロックのアドレスとの差分が示されており、
前記復元手段は、復元した前記第２の記号列が属するブロックのアドレスよりも、該差分だけ前のアドレスのブロック以降の１以上のブロックを、前記記憶手段から取得する、
ことを特徴とする請求項１１記載のデータ復元装置。
【請求項１３】
前記圧縮データにおける前記第２の記号列の符号には、前記第１の記号列の先頭の記号のブロック内での位置と、前記第２の記号列の先頭の記号のブロック内での位置とのずれ量が含まれており、
前記復元手段は、前記記憶手段から取得したブロック内の前記第１の記号列の記号を、前記ずれ量だけシフトして、直前に復元された記号列と結合する、
ことを特徴とする請求項１１または１２記載のデータ復元装置。
【請求項１４】
前記圧縮データにおける前記第２の記号列の符号には、前記第２の記号列の先頭の記号が属するブロックのアドレスと、前記第２の記号列の最後の記号が属するブロックのアドレスとの差分が含まれており、
前記復元手段は、前記第２の記号列を復元したとき、該差分で示された数のブロックを前記記憶手段に格納することを特徴とする請求項１１乃至１３のいずれかに記載のデータ復元装置。
【請求項１５】
前記圧縮データにおける前記第２の記号列の符号には、前記第２の記号列の最後の記号が属するブロックの先頭から、該ブロック内での該最後の記号の位置までの差分が含まれており、
前記復元手段は、前記第２の記号列を復元したとき、復元された記号列の後方から、該差分で示された範囲の記号列を保持し、該記号列の後方に、次に取得した符号に基づいて復元した記号列を結合することを特徴とする請求項１１乃至１４のいずれかに記載のデータ復元装置。
【請求項１６】
前記圧縮データには、先に調査した範囲に記号の配列が一致する記号列がない第３の記号列の符号と、前記第３の記号列のコピーとが含まれており、
前記復元手段は、前記第３の記号列の符号を取得すると、前記圧縮データから、前記第３の記号列のコピーをブロック単位で取得する、
ことを特徴とする請求項１１乃至１５のいずれかに記載のデータ復元装置。
【請求項１７】
コンピュータが、
圧縮対象のデータを、２以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査し、先に出現した第１の記号列と記号の配列が一致する第２の記号列を探索し、
前記第１の記号列の先頭の記号が属するブロックを特定する情報を含む符号を生成し、前記第２の記号列を該符号に符号化する、
データ圧縮方法。
【請求項１８】
コンピュータが、
圧縮対象のデータを、２以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査した場合に、先に出現した第１の記号列と記号の配列が一致する第２の記号列が、前記第１の記号列の先頭の記号が属するブロックを特定する情報を含む符号に符号化された圧縮データの先頭から順に、符号を取得し、
取得した符号から順に元の記号列に復元して、復元した記号列をブロック単位で記憶手段に格納し、
前記第２の記号列の符号を取得した場合には、前記第１の記号列の先頭の記号が属するブロックを特定する情報に基づいて、前記記憶手段から、復元された前記第１の記号列の先頭の記号が属するブロック以降の１以上のブロックを取得し、該１以上のブロックから前記第１の記号列をコピーして、前記第２の記号列を復元する、
データ復元方法。
【請求項１９】
コンピュータに、
圧縮対象のデータを、２以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査し、先に出現した第１の記号列と記号の配列が一致する第２の記号列を探索し、
前記第１の記号列の先頭の記号が属するブロックを特定する情報を含む符号を生成し、前記第２の記号列を該符号に符号化する、
処理を実行させるデータ圧縮プログラム。
【請求項２０】
コンピュータに、
圧縮対象のデータを、２以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査した場合に、先に出現した第１の記号列と記号の配列が一致する第２の記号列が、前記第１の記号列の先頭の記号が属するブロックを特定する情報を含む符号に符号化された圧縮データの先頭から順に、符号を取得し、
取得した符号から順に元の記号列に復元して、復元した記号列をブロック単位で記憶手段に格納し、
前記第２の記号列の符号を取得した場合には、前記第１の記号列の先頭の記号が属するブロックを特定する情報に基づいて、前記記憶手段から、復元された前記第１の記号列の先頭の記号が属するブロック以降の１以上のブロックを取得し、該１以上のブロックから前記第１の記号列をコピーして、前記第２の記号列を復元する、
処理を実行させるデータ復元プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データを圧縮するデータ圧縮装置、データ圧縮方法、およびデータ圧縮プログラム、並びに圧縮されたデータを復元するデータ復元装置、データ復元方法、およびデータ復元プログラムに関する。
【背景技術】
【０００２】
コンピュータなどの装置でデータを格納する場合、格納するデータを圧縮することがある。格納するデータを圧縮すれば、データの格納に必要な記憶容量が削減され、格納先の記憶装置を効率良く使用することができる。また情報通信を行う装置においてデータを送信する場合にも、送信するデータを圧縮することがある。送信するデータを圧縮すれば、送信対象のデータ量が削減され、データ送信時間を短縮することができる。
【０００３】
データの圧縮技術には、大別して可逆（loss-less）圧縮と非可逆（lossy）圧縮とがある。可逆圧縮は、データの欠落を許さずにデータ量を減らす技術である。他方、非可逆圧縮は、データの欠落を許容することで、高い圧縮率でデータを圧縮する技術である。テキストやプログラムなどの多くのデータは、欠落が許容されず、可逆圧縮により圧縮される。
【０００４】
可逆圧縮技術の１つに、ＬＺ（Lempel-Ziv）７７符号と呼ばれる符号に圧縮する技術がある。ＬＺ７７符号では、何度も出現する記号列を、その記号列が過去に出現した位置と長さとを示す符号に符号化する。データを復元する際には、各符号が、その符号における位置と長さで特定される記号列に置き換えられる。
【０００５】
ＬＺ７７符号を改良して、パソコンなどのメモリイメージを圧縮してＨＤＤ（Hard Disk Drive）などの格納装置に格納するときの処理時間を改善する技術も考えられている。この技術では、パソコンなどの主記憶全体の内容を圧縮してＨＤＤなどの格納装置に格納するとき、（ＣＰＵ（Central Processing Unit）のワード長÷圧縮処理の処理単位長（＝シンボル長））だけ離れたオフセットに対して最短のオフセット符号をアサインする。
【０００６】
また、少なくとも２つの異なるサイズのデータの繰り返しを用いて符号化・復号化することで、圧縮率を向上する技術も考えられている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００１−０９２６２７号公報
【特許文献２】特開２００２−０４３９５０号公報
【非特許文献】
【０００８】
【非特許文献１】井谷  宣子，吉田  茂，「ロスレス圧縮の技術と特許  圧縮ソフト  ＳＬＣ／ＥＬＣのアルゴリズム」，Ｃ  ＭＡＧＡＺＩＮＥ，ソフトバンククリエイティブ，２００４年９月１８日，２００４年１０月号，ｐｐ．１０６−１１０
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかし、ＬＺ７７符号では、データの復元の際に、先に復元した記号列から、符号に対応する記号列を記号ごとに取得することになるため、メモリアクセス回数が多くなり、復元処理の高速化が妨げられている。例えば１つの記号が１バイトで表されていれば、１バイト単位でのメモリアクセスを繰り返し行うことで、符号に対応する記号列が取得される。メモリアクセスは、ＣＰＵのレジスタ内での操作に比べて時間がかかるため、メモリアクセスが多いことは、復元処理の長期化の原因となる。
【００１０】
なお、上記の説明では、ＬＺ７７符号に関する問題を指摘したが、符号化対象の記号列を過去に出現した記号列の出現位置と長さで符号化する他の符号化技術においても、同様の問題が生じている。例えばＬＺ７７に改良を加えたＬＺＳＳでも、同様の問題が生じている。
【００１１】
１つの側面では、本発明は、データ復元の高速化を可能とすることを目的とする。
【課題を解決するための手段】
【００１２】
１つの案では、探索手段と符号化手段とを有するデータ圧縮装置が提供される。探索手段は、圧縮対象のデータを、２以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査し、先に出現した第１の記号列と記号の配列が一致する第２の記号列を探索する。符号化手段は、第１の記号列の先頭の記号が属するブロックを特定する情報を含む符号を生成し、第２の記号列を該符号に符号化する。
【発明の効果】
【００１３】
１態様によれば、データ復元の高速化が可能となる。
【図面の簡単な説明】
【００１４】
【図１】第１の実施の形態に係るシステムの機能構成例を示す図である。
【図２】本実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。
【図３】辞書と記号との対応付けを示す図である。
【図４】符号のデータ構造の一例を示す図である。
【図５】一致記号列がある場合の符号の一例を示す図である。
【図６】一致記号列がない場合の符号の一例を示す図である。
【図７】圧縮データの一例を示す図である。
【図８】データの圧縮・復元の機能を示すブロック図である。
【図９】圧縮処理の手順の一例を示すフローチャートである。
【図１０】データ復元処理の手順の一例を示す図である。
【図１１】レジスタ群を用いた復元手順の一例を示す図である。
【図１２】レジスタを効率的に利用した圧縮処理の手順の一例を示すフローチャートである。
【図１３】レジスタを効率的に利用した復元処理の手順の一例を示すフローチャートである。
【図１４】圧縮データの一例を示す図である。
【発明を実施するための形態】
【００１５】
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第１の実施の形態〕
まず、第１の実施の形態について説明する。第１の実施の形態は、圧縮されたデータの復元時に数バイト単位でメモリアクセスを行うことでメモリアクセス回数を低減し、復元速度を高速化するものである。例えばコンピュータは、長いデータ長単位でメモリアクセスを行うことで、処理を高速化することができる。特に最近のＣＰＵが有するレジスタのサイズは、３２ビット（４バイト）や６４ビット（８バイト）が一般的となっており、長いサイズのデータをそのままレジスタに格納し、レジスタ内でコピーなどの操作を行うことが可能である。そこで１命令で複数データを扱うＳＩＭＤ（Single Instruction Multiple Data）命令を用い、１６バイトまたは３２バイト単位でメモリのデータをレジスタにコピーすることで、データのコピーを高速に行うことができる。なおＳＩＭＤ命令を有する命令セットには、例えばＳＳＥ（Streaming SIMD Extensions）がある。
【００１６】
ただし、高速なブロック単位でのコピー処理が行えるように、ブロック単位で記号（シンボル）の一致・不一致を判断したのでは、記号が一致する確率が低くなり、圧縮率低下を招いてしまう。そこで、第１の実施の形態では、記号列の一致・不一致は記号ごとに行いながらも、復元時のメモリアクセスをブロック単位で行えるような符号化を行う。
【００１７】
図１は、第１の実施の形態に係るシステムの機能構成例を示す図である。第１の実施の形態は、データ１の圧縮と復元を行うために、データ圧縮装置２、記録媒体３、データ復元装置４、および記憶手段５（メモリ）を有する。データ圧縮装置２は、データ１を圧縮し、圧縮後の圧縮データ３ａを記録媒体３に保存する。データ復元装置４は、記録媒体３に保存された圧縮データ３ａに基づいてデータ１を復元し、復元データ５ａを記憶手段５に格納する。記憶手段５は、復元データ５ａを記憶する。
【００１８】
データ圧縮装置２は、データ１を圧縮するために、探索手段２ａと符号化手段２ｂとを有する。探索手段２ａは、圧縮対象のデータ１を、２以上の記号を含む複数のブロック１−１，１−２，１−３に分ける。例えば復元処理を行うプロセッサにおいてメモリ間の高速データコピーを扱える単位を１ブロックとする。図１の例ではブロック１−１，１−２，１−３を太線で示しており、１つのブロックに８個の記号を含んでいる。１つ目のブロック１−１のアドレスを「０」、２つ目のブロック１−２のアドレスを「１」、３つ目のブロック１−３のアドレスを「２」とする。
【００１９】
そして探索手段２ａは、データ１内の記号の配列を先頭から順に調査し、先に出現した第１の記号列１ａと記号の配列が一致する第２の記号列１ｂを探索する。例えば探索手段２ａは、データ１のうちの符号化済みの範囲から、未符号化の範囲の先頭の記号列と、できるだけ長く一致する同じ記号列を探索する。図１の例では、第２の記号列１ｂに対して、１ブロック前の２つ目の記号からの５つの記号「ａａａａａ」が一致している。ここで、符号化済みの範囲から見つかった記号列が第１の記号列１ａとなり、未符号化の範囲における同じ記号配列の記号列が第２の記号列１ｂとなる。
【００２０】
符号化手段２ｂは、第１の記号列１ａの先頭の記号が属するブロックを特定する情報を含む符号を生成し、第２の記号列１ｂをその符号に符号化する。例えば符号化手段２ｂは、第１の記号列１ａの先頭の記号が属するブロック１−１のアドレス「０」と、第２の記号列１ｂの先頭の記号が属するブロック１−２のアドレス「１」との差分を計算する。この差分は、第１の記号列１ａの先頭を、第２の記号列１ｂの先頭からの相対ブロック数で表したものである。そして符号化手段２ｂは、計算して得られた差分の値を、第１の記号列１ａの先頭の記号が属するブロック１−１を特定する情報とする。
【００２１】
また符号化手段２ｂは、第１の記号列１ａの先頭の記号のブロック内での位置を示す情報を、符号に含めてもよい。例えば符号化手段２ｂは、第１の記号列１ａの先頭の記号のブロック内での位置と、第２の記号列１ｂの先頭の記号のブロック内での位置とのずれ量（シフトバイト数）を、第２の記号列１ｂの符号に含める。図１の例では、第１の記号列１ａの先頭の記号は、ブロック１−１内の２つ目の記号であり、第２の記号列１ｂの先頭の記号は、ブロック１−２内の８つ目の記号である。そこで、ずれ量は「６」となる。
【００２２】
また符号化手段２ｂは、例えば第２の記号列１ｂの先頭の記号が属するブロック１−２のアドレス「１」と、第２の記号列１ｂの最後の記号が属するブロック１−３のアドレス「２」との差分（ストアブロック数）を、第２の記号列１ｂの符号に含めてもよい。図１の例では、差分は「１」となる。
【００２３】
また符号化手段２ｂは、例えば第２の記号列１ｂの最後の記号が属するブロック１−３の先頭から、そのブロック１−３内での、第２の記号列１ｂの最後の記号の位置までの差分（ストアバイト数）を、第２の記号列１ｂの符号に含めてもよい。図１の例では、第２の記号列１ｂの最後の記号は、ブロック１−３内の４つ目である。そこで、差分は「４」となる。
【００２４】
また符号化手段２ｂは、例えば先に調査した範囲に記号の配列が一致する記号列がない第３の記号列１ｃに基づいて、一致する記号列がないことを示す情報を含む符号を生成することもできる。この場合、例えば符号化手段２ｂは、第２の記号列１ｂの符号、第３の記号列１ｃの符号、および第３の記号列１ｃのコピーを含む圧縮データ３ａを生成する。
【００２５】
また符号化手段２ｂは、例えば第３の記号列１ｃの先頭の記号の、データ１のブロック１−３内での位置と、圧縮データ３ａを複数のブロックに分けたときの、第３の記号列１ｃのコピーの先頭の記号の、圧縮データ３ａのブロック内での位置との差分を計算する。そして符号化手段２ｂは、計算した差分を第３の記号列１ｃの符号に含めてもよい。
【００２６】
また符号化手段２ｂは、例えば第３の記号列１ｃの先頭の記号が属するブロック１−３のアドレス「２」と、第３の記号列１ｃの最後の記号が属するブロック１−３のアドレス「２」との差分を、第３の記号列１ｃの符号に含めてもよい。
【００２７】
また符号化手段２ｂは、例えば第３の記号列１ｃの最後の記号が属するブロック１−３の先頭から、そのブロック１−３内での第３の記号列１ｃの最後の記号の位置までの差分を、第３の記号列１ｃの符号に含めてもよい。
【００２８】
データ復元装置４は、記録媒体３に格納された圧縮データ３ａを復元するために、符号取得手段４ａと復元手段４ｂとを有している。
符号取得手段４ａは、圧縮データ３ａの先頭から順に、符号を取得する。符号取得手段４ａは、取得した符号を、復元手段４ｂに渡す。
【００２９】
復元手段４ｂは、取得した符号から順に元の記号列に復元して、復元した記号列をブロック単位で記憶手段５に格納する。復元手段４ｂは、第２の記号列１ｂの符号を取得した場合には、第１の記号列１ａの先頭の記号が属するブロックを特定する情報に基づいて、記憶手段５内の、復元された第１の記号列１ａの先頭の記号が属するブロック以降の１以上のブロックを取得する。そして復元手段４ｂは、１以上のブロックから第１の記号列１ａをコピーして、第２の記号列１ｂを復元する。
【００３０】
なお、第２の記号列１ｂの符号には、例えば、第１の記号列１ａの先頭の記号が属するブロック１−１のアドレス「０」と、第２の記号列１ｂの先頭の記号が属するブロック１−２のアドレス「１」との差分を含めることができる。この差分が含まれる場合、復元手段４ｂは、復元した第２の記号列が属するブロックのアドレスよりも、第２の記号列１ｂの符号に示された差分だけ前のアドレスのブロック以降の１以上のブロックを、記憶手段５から取得する。
【００３１】
また第２の記号列１ｂの符号には、第１の記号列１ａの先頭の記号のブロック内での位置と、第２の記号列１ｂの先頭の記号のブロック内での位置とのずれ量を含めることができる。この差分が含まれる場合、復元手段４ｂは、記憶手段５から取得したブロック内の第１の記号列の記号を、そのずれ量だけシフトして、直前に復元された記号列と結合する。
【００３２】
また第２の記号列１ｂの符号には、第２の記号列１ｂの先頭の記号が属するブロックのアドレスと、第２の記号列１ｂの最後の記号が属するブロックのアドレスとの差分を含めることができる。この差分が含まれる場合は、復元手段４ｂは、第２の記号列１ｂを復元したとき、その差分で示された数のブロックを記憶手段５に格納する。
【００３３】
また第２の記号列１ｂの符号には、第２の記号列１ｂの最後の記号が属するブロックの先頭から、該ブロック内での該最後の記号の位置までの差分を含めることができる。この差分が含まれる場合は、復元手段４ｂは、第２の記号列を復元したとき、復元された記号列の後方から、その差分で示された範囲の記号列を保持する。そして復元手段４ｂは、保持した記号列の後方に、次に取得した符号に基づいて復元した記号列を結合する。
【００３４】
また、圧縮データ３ａには、先に調査した範囲に記号の配列が一致する記号列がない第３の記号列１ｃの符号と、第３の記号列１ｃのコピーとが含まれている。そこで復元手段４ｂは、第３の記号列１ｃの符号を取得すると、圧縮データ３ａから、第３の記号列１ｃのコピーをブロック単位で取得する。そして復元手段４ｂは、取得したブロックから、第２の記号列１ｂの復元の場合と同様に、記号列のコピーなどの処理を行い、第３の記号列１ｃを復元する。
【００３５】
このようなシステムによれば、圧縮対象のデータ１における第２の記号列１ｂは、例えば４つの値に符号化される。１つ目の値は、第１の記号列１ａの先頭の記号が属するブロック１−１のアドレス「０」と、第２の記号列１ｂの先頭の記号が属するブロック１−２のアドレス「１」との差分（相対ブロック数）である。２つ目の値は、第１の記号列１ａの先頭の記号のブロック内での位置と、第２の記号列１ｂの先頭の記号のブロック内での位置とのずれ量（シフトバイト数）である。３つ目の値は、第２の記号列１ｂの先頭の記号が属するブロック１−２のアドレス「１」と、第２の記号列１ｂの最後の記号が属するブロック１−３のアドレス「２」との差分（ストアブロック数）である。４つ目の値は、第２の記号列１ｂの最後の記号が属するブロック１−３の先頭から、そのブロック１−３内での、第２の記号列１ｂの最後の記号の位置までの差分（ストアバイト数）である。
【００３６】
また、圧縮対象のデータ１における第３の記号列１ｃは、例えば４つの値に符号化される。１つ目は、一致する記号列がないことを示す情報である。２つ目は、第３の記号列１ｃの先頭の記号の、データ１のブロック１−３内での位置と、圧縮データ３ａを複数のブロックに分けたときの、第３の記号列１ｃのコピーの先頭の記号の、圧縮データ３ａのブロック内での位置との差分（シフトバイト数）である。３つ目は、第３の記号列１ｃの先頭の記号が属するブロック１−３のアドレス「２」と、第３の記号列１ｃの最後の記号が属するブロック１−３のアドレスとの差分（ストアブロック数）である。４つ目は、第３の記号列１ｃの最後の記号が属するブロック１−３の先頭から、そのブロック１−３内での第３の記号列１ｃの最後の記号の位置までの差分（ストアバイト数）である。
【００３７】
データを復元する際には、復元手段４ｂは、例えば、ブロックに満たないバイト列を一時的に保存するレジスタ４ｂａを使用して復元処理を行う。第２の記号列１ｂの符号を復元する直前では、７バイト「ｂｂｂｂｂｂｃ」がレジスタ４ｂａに格納されている。また符号（１，６，１，４）からは、相対ブロック数「１」、シフトバイト数「６」、ストアブロック数「１」、ストアバイト数「４」が得られる。そして、復元手段４ｂは、現在位置のブロックの１ブロック前のブロックから１ブロックを取得し、別のレジスタ４ｂｂに格納する。これによりレジスタ４ｂｂには「ｂａａａａａｂｂ」の記号列が格納される。復元手段４ｂは、取得したブロックの記号列を６バイト右にシフトする。すると「ｂａａａａａｂｂ」の先頭が６バイト目の位置となる。そして復元手段４ｂは、シフトした位置と合致するレジスタ４ｂａの位置へ、レジスタ４ｂｂの記号をコピーする。このときレジスタ４ｂａ内の記号がすでに格納されている領域には、コピーされない。すると、レジスタ４ｂｂ内の記号列のうち、２つ目の記号からの記号列「ａａａａａｂｂ」が、レジスタ４ｂａ内の「ｂｂｂｂｂｂｃ」の後に結合される。
【００３８】
次に復元手段４ｂは、ストアブロック数「１」に基づいて、１ブロック分を記憶手段５内に追加格納する。格納されたブロックは、復元データ５ａの後方に追加される。さらに復元手段４ｂは、ストアバイト数「４」に基づいて、復元した記号列の最後尾を、次の１ブロックの４バイト目と認識する。
【００３９】
このような符号に符号化されることで、復元時には、相対ブロック数とストア数（ストアブロック数）とにより、記憶手段５へのアクセスをブロック単位で行うことができ、復元の高速化が実現される。しかも、コピー元とコピー先のブロック内の繰返し開始位置のずれ量（シフトバイト数）とブロックに満たないバイト数（ストアバイト数）を符号に加えたことで、記号列の一致・不一致をバイト単位で処理することが可能となっている。その結果、データの圧縮率の低下が抑止されている。
【００４０】
なお符号化手段２ｂは、圧縮データ３ａを記録媒体３に格納する際に、圧縮データ３ａを複数のブロックに分け、符号と第３の記号列１ｃのコピーとを、異なるブロックに格納するようにしてもよい。これにより、データ復元装置４が圧縮データ３ａを読み込む際に、ブロック単位で行うことが可能となり、データ復元をさらに高速化することができる。
【００４１】
なお、探索手段２ａ、符号化手段２ｂは、例えばデータ圧縮装置２が有するプロセッサにより実現することができる。また符号取得手段４ａ、復元手段４ｂは、データ復元装置４が有するプロセッサにより実現することができる。
【００４２】
また、図１に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
〔第２の実施の形態〕
次に第２の実施の形態について説明する。第２の実施の形態は、データの復元時にレジスタ内でのデータのシフトによって、符号に対応するデータのコピーを可能とし、処理効率を向上させたものである。
【００４３】
図２は、本実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。コンピュータ１００は、プロセッサ１０１によって装置全体が制御されている。プロセッサ１０１には、バス１０９を介してＲＡＭ（Random Access Memory）１０２と複数の周辺機器が接続されている。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＭＰＵ（Micro Processing Unit）、またはＤＳＰ（Digital Signal Processor）である。プロセッサ１０１の機能の少なくとも一部を、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現してもよい。
【００４４】
ＲＡＭ１０２は、コンピュータ１００の主記憶装置として使用される。ＲＡＭ１０２には、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ１０２には、プロセッサ１０１による処理に必要な各種データが格納される。
【００４５】
バス１０９に接続されている周辺機器としては、ＨＤＤ１０３、グラフィック処理装置１０４、入力インタフェース１０５、光学ドライブ装置１０６、機器接続インタフェース１０７およびネットワークインタフェース１０８がある。
【００４６】
ＨＤＤ１０３は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、コンピュータ１００の補助記憶装置として使用される。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。なお、補助記憶装置としては、フラッシュメモリなどの半導体記憶装置を使用することもできる。
【００４７】
グラフィック処理装置１０４には、モニタ１１が接続されている。グラフィック処理装置１０４は、プロセッサ１０１からの命令に従って、画像をモニタ１１の画面に表示させる。モニタ１１としては、ＣＲＴ（Cathode Ray Tube）を用いた表示装置や液晶表示装置などがある。
【００４８】
入力インタフェース１０５には、キーボード１２とマウス１３とが接続されている。入力インタフェース１０５は、キーボード１２やマウス１３から送られてくる信号をプロセッサ１０１に送信する。なお、マウス１３は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【００４９】
光学ドライブ装置１０６は、レーザ光などを利用して、光ディスク１４に記録されたデータの読み取りを行う。光ディスク１４は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク１４には、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。
【００５０】
機器接続インタフェース１０７は、コンピュータ１００に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース１０７には、メモリ装置１５やメモリリーダライタ１６を接続することができる。メモリ装置１５は、機器接続インタフェース１０７との通信機能を搭載した記録媒体である。メモリリーダライタ１６は、メモリカード１７へのデータの書き込み、またはメモリカード１７からのデータの読み出しを行う装置である。メモリカード１７は、カード型の記録媒体である。
【００５１】
ネットワークインタフェース１０８は、ネットワーク１０に接続されている。ネットワークインタフェース１０８は、ネットワーク１０を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
【００５２】
以上のようなハードウェア構成によって、第２の実施の形態の処理機能を実現することができる。なお、第１の実施の形態に示した装置も、図２に示したコンピュータ１００と同様のハードウェアにより実現することができる。
【００５３】
コンピュータ１００は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第２の実施の形態の処理機能を実現する。コンピュータ１００に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、コンピュータ１００に実行させるプログラムをＨＤＤ１０３に格納しておくことができる。プロセッサ１０１は、ＨＤＤ１０３内のプログラムの少なくとも一部をＲＡＭ１０２にロードし、プログラムを実行する。またコンピュータ１００に実行させるプログラムを、光ディスク１４、メモリ装置１５、メモリカード１７などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ１０１からの制御により、ＨＤＤ１０３にインストールされた後、実行可能となる。またプロセッサ１０１が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
【００５４】
このようなコンピュータ１００により、データの圧縮と復元が行われる。ここで、第２の実施の形態における符号化方式について説明する。第２の実施の形態では、既に符号化された記号列を辞書として用いた符号化が行われる。
【００５５】
図３は、辞書と記号との対応付けを示す図である。第２の実施の形態では、スライド窓と呼ばれるバッファ１１２が用意される。バッファ１１２には、符号化対象の記号列が、先頭から順にＦＩＦＯ（先入れ−先出し）方式で格納される。バッファ１１２の前半は参照部１１２ａであり、後半は符号化部１１２ｂである。参照部１１２ａは、符号化済みの記号列が格納される。符号化部１１２ｂには、符号化されていない記号列が格納される。
【００５６】
第２の実施の形態では、符号化対象のデータは、複数のブロック２１〜２４に分割されている。各ブロック２１〜２４には、所定数の記号列が含まれる。図３の例では、１つの記号のデータ長を１バイトとし、１ブロックに８つの記号が含まれるものとしている。すなわち、８バイトで１ブロックとなる。
【００５７】
未圧縮の記号を符号化する場合、符号化部１１２ｂの先頭からの記号列から、最も長く一致する記号列が参照部１１２ａから検索される。図３の例では、符号化部１１２ｂに「ｃｏｍｐｒｅｓｓ  ｐｒｅｓｓｉｏｎ．」という記号列が格納されている。このうち「ｃｏｍｐｒｅｓｓ」という記号列が、参照部１１２ａから検出できる。すると、「ｃｏｍｐｒｅｓｓ」という記号列が、参照部１１２ａ内での一致した記号列の位置や、一致した記号列の一致終了位置を表す符号に、符号化される。
【００５８】
「ｃｏｍｐｒｅｓｓ」に続く記号列は、先頭のスペースの記号だけが、参照部１１２ａから検出できる。このように、一致する記号列が１つの記号だけの場合、符号化してもデータ量の削減効果があまり期待できない。そこで第２の実施の形態では、一致する記号列が１つの記号だけの場合には、一致する記号列はないと判定するものとする。なお、一致する記号列の長さがどの程度以上であれば、一致すると判定するのかは、任意に設定可能である。例えば１つの記号（１バイト）でも一致すれば、記号列が一致すると判定してもよい。また、例えば３つの記号（３バイト）以上一致した場合に、記号列が一致すると判定することもできる。一致する記号列がない場合は、参照部１１２ａ内に一致する記号列がないことを示す符号（不一致符号）と、圧縮データ内での該当記号列の位置や、一致した記号列の一致終了位置を表す符号に、符号化される。
【００５９】
スペースに続く「ｐｒｅｓｓｉｏｎ」という記号列は、参照部１１２ａから検出できる。すると、「ｐｒｅｓｓｉｏｎ」という記号列が、参照部１１２ａ内の一致した記号列の位置や、一致した記号列の一致終了位置を表す符号に、符号化される。
【００６０】
第２の実施の形態では、データを圧縮する際には、データの復元時にブロック単位でのメモリアクセスが容易となるような形式の符号に、符号化される。
図４は、符号のデータ構造の一例を示す図である。第２の実施の形態では、２バイト（１６ビット）の符号に符号化される。一致記号列がある場合は、相対ブロック数、シフトバイト数、ストアブロック数、およびストアバイト数を示す値に符号化される。また一致記号列がない場合は、不一致符号、シフトバイト数、ストアブロック数、ストアバイト数を示す値に符号化される。相対ブロック数は、５ビットのデータであり、「１−３１」の数値である。シフトバイト数は３ビットのデータであり、「０−７」の数値である。ストアブロック数は５ビットのデータであり、「１−３１」の数値を示す。ストアバイト数は３ビットのデータであり、「０−７」の数値を示す。ここで一致記号列がない場合、相対ブロック数の領域に「０」が設定される。この「０」値が、不一致符号である。
【００６１】
次に、符号内の各値の意味について説明する。
図５は、一致記号列がある場合の符号の一例を示す図である。圧縮対象データ３１は、８バイトのブロック単位に分けられている。各ブロックには「０」から昇順のアドレスが付与されている。ブロック内の各記号（１バイト）には、左から順に、「０」から昇順のバイト番号が付与されている。
【００６２】
「ｐｒｅｓｓｉｏｎ」という記号列を符号化する場合について説明する。符号化対象の「ｐｒｅｓｓｉｏｎ」という記号列は、ブロックアドレス「２」のブロックの８番目記号（ブロック内のバイト番号「７」）から、ブロックアドレス「３」のブロックの７番目記号（ブロック内のバイト番号「６」）までの８バイトである。符号化対象の記号列に一致する記号列は、ブロックアドレス「０」のブロックの４番目記号（ブロック内のバイト番号「３」）から、ブロックアドレス「１」のブロックの３番目記号（ブロック内のバイト番号「２」）までの８バイトである。
【００６３】
相対ブロック数は、符号化対象の記号列の先頭の記号を含むブロックのアドレスと、符号化対象の記号列に一致する記号列の先頭の記号を含むブロックのアドレスとの差分である。図５の例では、相対ブロック数は「２」である。
【００６４】
シフトバイト数は、符号化対象の記号列の先頭の記号のブロック内での位置と、符号化対象の記号列に一致する記号列の先頭の記号のブロック内での位置との差分である。例えば、符号化対象の記号列の先頭の記号のブロック内での位置を示すバイト番号から、符号化対象の記号列に一致する記号列の先頭の記号のブロック内での位置を示すバイト番号を減算した値が、シフトバイト数となる。ただし、減算した値が負になるときは、減算結果に「８」（１ブロック分のバイト数）が加算される。図５の例では、シフトバイト数は「４」である。
【００６５】
ストアブロック数は、符号化対象の記号列の先頭の記号を含むブロックのアドレスと、その記号列の最後の記号（一致終了位置）を含むブロックのアドレスとの差分である。図５の例では、ストアブロック数は「１」である。
【００６６】
ストアバイト数は、符号化対象の記号列の最後の記号を含むブロックの先頭の記号から、その記号列の最後の記号までの記号数である。図５の例では、ストアバイト数は「７」である。
【００６７】
このようにして、一致記号列がある場合の符号Ｃ４が生成される。次に、一致記号列がない場合の符号について説明する。なお、一致記号列が見つからない記号が連続していれば、その記号列がまとめて符号化される。
【００６８】
図６は、一致記号列がない場合の符号の一例を示す図である。一致記号列がない場合には、圧縮データ３２における記号の位置に関する情報を使用して符号が生成される。圧縮データ３２は、８バイトのブロック単位に分けられている。各ブロックには「０」から昇順のアドレスが付与されている。ブロック内の各記号（１バイト）には、左から順に、「０」から昇順のバイト番号が付与されている。
【００６９】
「ｃｏｍｐｒｅｓｓｉｏｎ  ｄｅ」の記号列を符号化する場合について説明する。この記号列は、ブロックアドレス「０」のブロックの１番目記号（ブロック内のバイト番号「０」）から、ブロックアドレス「１」のブロックの６番目記号（ブロック内のバイト番号「５」）までの１４バイトである。この記号列は、一致する記号列が見つからない。そこで、符号の最初の７ビットの値には、不一致符号「０」が設定される。
【００７０】
シフトバイト数は、符号化対象の記号列の先頭の記号のブロック内での位置と、圧縮データ３２に該当する記号列を格納した場合における、その記号列の先頭の記号のブロック内での位置との差分である。例えば、符号化対象の記号列の先頭の記号のブロック内での位置を示すバイト番号から、圧縮データ３２内での該当記号列の先頭の記号のブロック内での位置を示すバイト番号を減算した値が、シフトバイト数となる。ただし、減算した値が負になるときは、減算結果に「８」（１ブロック分のバイト数）が加算される。なお一致記号列がない場合、生成された符号（２バイト）の後に続けて、圧縮対象の記号列が格納される。そのため、符号の分を考慮して、圧縮データ３２内での記号列の先頭の記号の位置が判断される。図６の例では、符号化対象の記号列の先頭の記号のブロック内での位置を示すバイト番号が「０」、圧縮データ３２内での該当記号列の先頭の記号のブロック内での位置を示すバイト番号が「２」である。すると「０」から「２」を減算すると「−２」となる。減算結果が負であるため８が加算され、シフトバイト数は「６」となる。
【００７１】
ストアブロック数は、符号化対象の記号列の先頭の記号を含むブロックのアドレスと、その記号列の最後の記号（不一致終了位置）を含むブロックのアドレスとの差分である。図６の例では、ストアブロック数は「１」である。
【００７２】
ストアバイト数は、符号化対象の記号列の最後の記号を含むブロックの先頭の記号から、その記号列の最後の記号までの記号数である。図６の例では、ストアバイト数は「６」である。
【００７３】
生成された符号Ｃ１は、圧縮データ３２の記憶領域に格納される。そして、一致する記号列が見つからなかった符号化前の記号列が、符号Ｃ１に続けて格納される。図６の例では、符号Ｃ１に続けて、「ｃｏｍｐｒｅｓｓｉｏｎ  ｄｅ」の記号列が格納されている。
【００７４】
図７は、圧縮データの一例を示す図である。図７の例では、「ｃｏｍｐｒｅｓｓｉｏｎ  ｄｅ」の記号列は、圧縮されずに、符号Ｃ１に続けて圧縮データ３２に設定されている。「ｃｏｍｐｒｅｓｓ」の記号列は、符号Ｃ２に圧縮され、圧縮データ３２に設定されている。スペースの記号は、符号Ｃ３に続けて、圧縮データ３２に設定されている。「ｐｒｅｓｓｉｏｎ」の記号列は、符号Ｃ４に圧縮され、圧縮データ３２に設定されている。
【００７５】
図３〜図７に示したように符号化することで、元のデータよりも圧縮データのデータ量は削減される。すなわち、データが圧縮される。この圧縮方式は可逆圧縮である。従って、圧縮データに基づいて、データを欠損させずに復元することができる。
【００７６】
次に、図３〜図７に示した符号化によるデータの圧縮と、圧縮されたデータの復元とを行うための、コンピュータ１００の機能について説明する。
図８は、データの圧縮・復元の機能を示すブロック図である。コンピュータ１００は、圧縮部１１０、圧縮データ記憶部１２０、復元部１３０、および復元データ記憶部１４０を有している。
【００７７】
圧縮部１１０は、圧縮対象のデータを圧縮する。例えばＲＡＭ１０２、ＨＤＤ１０３、光ディスク１４、メモリカード１７のいずれかに格納されたデータを圧縮する。また圧縮部１１０は、ネットワーク１０を介して受信したデータを圧縮することもできる。圧縮部１１０は、圧縮したデータ（圧縮データ）を、圧縮データ記憶部１２０に格納する。
【００７８】
圧縮データ記憶部１２０は、圧縮部１１０で圧縮された圧縮データを記憶する。例えばＲＡＭ１０２、ＨＤＤ１０３、光ディスク１４、メモリカード１７のいずれかの記憶領域の一部を、圧縮データ記憶部１２０として使用することができる。
【００７９】
復元部１３０は、圧縮データ記憶部１２０に格納された圧縮データを、元のデータに復元する。復元部１３０は、復元したデータをブロック単位で復元データ記憶部１４０に書き込む。また復元部１３０は、復元時には、既に復元した記号が格納されたブロックを復元データ記憶部１４０からブロック単位で読み出すか、圧縮データ内の記号を圧縮データ記憶部１２０からブロック単位で読み出す。そして復元部１３０は、圧縮データ内の符号を、読み出したブロック内の記号に置き換えることで、符号を元の記号に復元する。
【００８０】
復元データ記憶部１４０は、復元されたデータを記憶する。例えばＲＡＭ１０２、ＨＤＤ１０３、光ディスク１４、メモリカード１７のいずれかの記憶領域の一部を、復元データ記憶部１４０として使用することができる。なお復元を高速に行うには、高速にアクセス可能な装置を、復元データ記憶部１４０と使用することが望ましい。そこで、第２の実施の形態では、復元データ記憶部１４０は、ＲＡＭ１０２の記憶領域の一部であるものとする。
【００８１】
次に、圧縮部１１０と復元部１３０との機能の詳細について説明する。
圧縮部１１０は、データ取得部１１１、バッファ１１２、一致検出部１１３、相対ブロック数算出部１１４、シフトバイト数算出部１１５、ストアブロック数算出部１１６、ストアバイト数算出部１１７、および符号生成部１１８を有する。
【００８２】
データ取得部１１１は、圧縮対象のデータを取得する。例えばデータ取得部１１１は、ユーザからの入力に基づいて、圧縮対象のデータを把握する。圧縮対象のデータは、例えば、ＨＤＤ１０３、光ディスク１４、またはメモリカード１７に格納されたデータである。またネットワークインタフェース１０８がネットワーク１０を介して受信したデータを圧縮対象とすることもできる。データ取得部１１１は、圧縮対象のデータ（記号列）を、順次バッファ１１２に格納する。
【００８３】
バッファ１１２は、符号化済みの所定量の記号列と、符号化対象の所定量の記号列とを記憶する。バッファ１１２の構造は、図３に示した通りである。
一致検出部１１３は、符号化部１１２ｂの先頭から始まるできるだけ長い記号列に一致する記号列を、バッファ１１２の参照部１１２ａ内の記号列から検出する。一致検出部１１３は、一致する記号列が見つかった場合、参照部１１２ａ内の該当する記号列の位置と、記号列の長さとを特定する。また一致検出部１１３は、一致する記号列が見つからなかった場合、一致する記号列が見つからなかった記号列の長さを特定する。一致検出部１１３は、一致する記号列が見つからなかった場合、不一致符号を示す値「０」を５ビットで表し、その値を符号生成部１１８に出力する。また一致検出部１１３は、一致する記号列が見つからなかった場合、不一致であることを示す情報を符号生成部１１８に出力してもよい。その場合、不一致であることを示す情報を受け取った符号生成部１１８が符号を生成する際に、その符号の先頭の５ビットに「０」を設定する。
【００８４】
相対ブロック数算出部１１４は、一致検出部１１３により、一致する記号列が見つかった場合、相対ブロック数を算出する。例えば相対ブロック数算出部１１４は、符号化部１１２ｂの先頭の記号が含まれるブロックのアドレスから、参照部１１２ａ内の一致した記号列が含まれるブロックのアドレスを減算する。そして相対ブロック数算出部１１４は、減算した結果を相対ブロック数とする。そして、相対ブロック数算出部１１４は、５ビットで表した相対ブロック数を、符号生成部１１８に出力する。
【００８５】
シフトバイト数算出部１１５は、一致検出部１１３の検出結果に応じて、シフトバイト数を算出する。例えばシフトバイト数算出部１１５は、一致する記号列が見つかった場合、符号化部１１２ｂの先頭の記号のバイト番号に８を加算する。８を加算するのは、次の減算による結果が、常に正の値になるようにするためである。シフトバイト数算出部１１５は、加算結果から、参照部１１２ａ内における一致する記号列の先頭の記号のバイト番号を減算する。そしてシフトバイト数算出部１１５は、減算結果を８で除算したときの剰余を、シフトバイト数とする。またシフトバイト数算出部１１５は、一致する記号列が見つからなかった場合、符号化部１１２ｂの先頭の記号のバイト番号に８を加算し、さらに圧縮データ内での該当記号列の先頭の記号のバイト番号を減算する。そしてシフトバイト数算出部１１５は、減算結果を８で除算したときの剰余を、シフトバイト数とする。シフトバイト数算出部１１５は、算出したシフトバイト数を３ビットで表し、その値を符号生成部１１８に出力する。
【００８６】
ストアブロック数算出部１１６は、一致検出部１１３の検出結果に応じて、ストアブロック数を算出する。例えばストアブロック数算出部１１６は、一致する記号列が見つかった場合、符号化部１１２ｂ内の一致した記号列の最後の記号（一致終了位置）を含むブロックのアドレスから、符号化部１１２ｂの先頭の記号を含むブロックのアドレスを減算する。そしてストアブロック数算出部１１６は、減算した結果を、ストアブロック数とする。またストアブロック数算出部１１６は、一致する記号列が見つからなかった場合、一致する記号列が見つからないと判定された最後の記号を含むブロックのアドレスから、その符号化部１１２ｂの先頭の記号を含むブロックのアドレスを減算する。ストアブロック数算出部１１６は、減算した結果を、ストアブロック数とする。そして、ストアブロック数算出部１１６は、算出したストアブロック数を５ビットで表し、その値を符号生成部１１８に出力する。
【００８７】
ストアバイト数算出部１１７は、一致検出部１１３の検出結果に応じて、ストアバイト数を算出する。例えばストアバイト数算出部１１７は、一致する記号列が見つかった場合、一致する記号列が見つかった符号化部１１２ｂ内の記号列の最後の記号を含むブロックの先頭から、その記号列の最後の記号までの記号数をストアバイト数とする。なお、この記号数は、符号化対象の記号列の最後の記号のバイト番号に１を加算した値となる。またストアバイト数算出部１１７は、一致する記号列が見つらなかった場合、一致する記号列が見つからないと最後に判定された記号を含むブロックの先頭の記号から、最後に判定された記号までの記号数をストアバイト数とする。そしてストアバイト数算出部１１７は、算出したストアバイト数を３ビットで表し、その値を符号生成部１１８に出力する。
【００８８】
符号生成部１１８は、２バイトの領域に、相対ブロック数算出部１１４の出力値、シフトバイト数算出部１１５の出力値、ストアブロック数算出部１１６の出力値、ストアバイト数算出部１１７の出力値の順で設定する。符号生成部１１８は、得られた２バイトの値を、符号として、圧縮データ記憶部１２０に格納する。なお符号生成部１１８は、相対ブロック数算出部１１４から不一致符号が出力された場合、バッファ１１２の符号化部１１２ｂから、一致する記号列が見つからなかった記号列を取得する。そして符号生成部１１８は、一致する記号列が見つからなかった場合の符号に続けて、取得した記号列を圧縮データ記憶部１２０に格納する。
【００８９】
なお、図１の探索手段２ａは、圧縮部１１０内のデータ取得部１１１、バッファ１１２、および一致検出部１１３によって実現される。また図１の符号化手段２ｂは、相対ブロック数算出部１１４、シフトバイト数算出部１１５、ストアブロック数算出部１１６、ストアバイト数算出部１１７、および符号生成部１１８によって実現される。
【００９０】
次に、復元部１３０の機能の詳細について説明する。
復元部１３０は、符号解析部１３１、ブロック取得部１３２、レジスタ群１３３、記号列生成部１３４、およびブロック出力部１３５を有する。
【００９１】
符号解析部１３１は、復元する圧縮データを圧縮データ記憶部１２０から取得する。そして符号解析部１３１は、取得した圧縮データの符号を先頭から順に解析する。例えば符号解析部１３１は、圧縮データの先頭から２バイトずつ符号を取得する。符号解析部１３１は、取得した符号の先頭の５ビットを相対ブロック数、次の３ビットをシフトバイト数、次の５ビットをストアブロック数、最後の３ビットをストアバイト数と認識する。ただし、先頭の５ビットの値が０の場合、符号解析部１３１は、その５ビットは相対ブロック数ではなく、不一致符号であると認識する。
【００９２】
ブロック取得部１３２は、符号解析部１３１による解析結果に基づいて、データの復元に用いるブロックを、圧縮データ記憶部１２０または復元データ記憶部１４０から取得する。例えばブロック取得部１３２は、復元対象の符号に相対ブロック数が含まれている場合、復元中のブロック（現在のブロック）のアドレスよりも相対ブロック数分だけ前のアドレスのブロックから順に、復元データ記憶部１４０からブロックを取得する。またブロック取得部１３２は、復元対象の符号に不一致符号が含まれている場合、復元対象の符号に続けて格納されている記号列を、ブロック単位で圧縮データ記憶部１２０から取得する。ブロック取得部１３２は、１つの復元対象の符号に応じたブロックの取得を、その符号に示されるストアブロック数分のブロックのストアが完了するまで続ける。
【００９３】
レジスタ群１３３は、ブロック取得部１３２が取得したブロックの値（記号列）を格納する、複数のレジスタである。このレジスタ群１３３内で記号列のシフトや結合（マージ）などの操作を行うことで、圧縮前の記号列を復元することができる。
【００９４】
記号列生成部１３４は、符号解析部１３１による解析結果に基づいて、レジスタ群１３３内の記号列を操作し、圧縮前の記号列をブロック単位で復元する。
ブロック出力部１３５は、レジスタ群１３３内に復元された記号列を、ブロック単位で復元データ記憶部１４０に格納する。
【００９５】
なお、図１の符号取得手段４ａは、符号解析部１３１によって実現される。また図１の復元手段４ｂは、ブロック取得部１３２、レジスタ群１３３、記号列生成部１３４、およびブロック出力部１３５によって実現される。
【００９６】
また、図８に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
次に、圧縮処理の手順について説明する。
【００９７】
図９は、圧縮処理の手順の一例を示すフローチャートである。この処理は、例えば圧縮対象データを指定した圧縮指示が入力されたときに実行される。
［ステップＳ１０１］データ取得部１１１は、バッファ１１２の符号化部１１２ｂの容量分の記号列を、圧縮対象データの先頭から順に符号化部１１２ｂに格納する。なお符号化部１１２ｂ内の符号化された記号は参照部１１２ａにシフトされる。そのため、データ取得部１１１は、記号列が符号化されるごとに、符号化されたデータ量分の未圧縮の記号列を符号化部１１２ｂに格納する。
【００９８】
そして、一致検出部１１３は、バッファ１１２内の符号化部１１２ｂの先頭の記号から順に選択し、選択した記号列に一致する記号列を、参照部１１２ａから探索する。
［ステップＳ１０２］一致検出部１１３は、一致する記号列があるか否かを判断する。一致する記号列がある場合、処理がステップＳ１０４に進められる。一致する記号列がない場合、処理がステップＳ１０３に進められる。
【００９９】
［ステップＳ１０３］一致する記号列が見つからなかった場合、一致検出部１１３は、一致記号が見つからなかった記号の長さ（バイト数）をカウントする。例えば、新たに探索して一致記号が見つからなかった記号列のバイト数を、一致記号が見つからなかった記号の長さに加算する。そして一致検出部１１３は、処理をステップＳ１０１に進め、次の記号を選択して、一致する記号列の探索を行う。
【０１００】
［ステップＳ１０４］一致する記号列が見つかった場合、一致検出部１１３は、一致する記号列が検出できた記号列の直前に、「一致記号列なし」と判定された記号列（不一致記号列）があるか否かを判断する。不一致記号列がある場合、処理がステップＳ１０５に進められる。不一致記号列がない場合、処理がステップＳ１０８に進められる。
【０１０１】
［ステップＳ１０５］一致記号列なしと判定された記号列がある場合、一致検出部１１３は、不一致符号を生成する。一致検出部１１３は、不一致符号を、符号生成部１１８に出力する。
【０１０２】
［ステップＳ１０６］シフトバイト数算出部１１５、ストアブロック数算出部１１６、ストアバイト数算出部１１７が、それぞれシフトバイト数、ストアブロック数、およびストアバイト数を算出する。なお、ストアブロック数とストアバイト数との算出には、一致記号が見つからなかった長さが利用される。すなわち、符号化部１１２ｂの先頭の記号から、一致記号が見つからなかった長さが、不一致記号列の長さとなる。そして不一致記号列の最後の記号の位置が不一致終了位置となる。その不一致終了位置に基づいて、ストアブロック数とストアバイト数とが算出される。シフトバイト数算出部１１５、ストアブロック数算出部１１６、ストアバイト数算出部１１７それぞれは、算出した値を符号生成部１１８に出力する。
【０１０３】
［ステップＳ１０７］符号生成部１１８は、出力された値を繋げて、一致する記号列がない場合の符号を生成する。そして符号生成部１１８は、生成した符号を、圧縮データ記憶部１２０に格納する。次に符号生成部１１８は、一致記号列なしと判断された記号列をバッファ１１２の符号化部１１２ｂから取得し、圧縮データ記憶部１２０に格納する。
【０１０４】
［ステップＳ１０８］相対ブロック数算出部１１４、シフトバイト数算出部１１５、ストアブロック数算出部１１６、ストアバイト数算出部１１７が、それぞれ相対ブロック数、シフトバイト数、ストアブロック数、およびストアバイト数を算出する。相対ブロック数算出部１１４、シフトバイト数算出部１１５、ストアブロック数算出部１１６、ストアバイト数算出部１１７それぞれは、算出した値を符号生成部１１８に出力する。
【０１０５】
［ステップＳ１０９］符号生成部１１８は、他の要素から出力された値を繋げて、一致する記号列がある場合の符号を生成する。そして符号生成部１１８は、生成した符号を、圧縮データ記憶部１２０に格納する。
【０１０６】
［ステップＳ１１０］一致検出部１１３は、すべてのデータの符号化が終了したか否かを判断する。例えば一致検出部１１３は、バッファ１１２の符号化部１１２ｂが空になった場合、符号化が終了したと判断する。符号化が終了した場合、データの圧縮処理を終了する。符号化が終了していなければ、処理がステップＳ１０１に進められる。
【０１０７】
このようにして、データが圧縮され、圧縮データ３２が圧縮データ記憶部１２０に格納される。圧縮データ記憶部１２０に格納された圧縮データ３２は、復元部１３０によって元のデータに復元される。
【０１０８】
図１０は、データ復元処理の手順の一例を示す図である。この処理は、例えば圧縮データを指定した復元指示が入力されたときに実行される。
［ステップＳ１２１］符号解析部１３１は、圧縮データの先頭から順に符号を読み出す。そして符号解析部１３１は、読み出した符号が、一致記号列がある場合の符号か否かを判断する。例えば符号の最初の５ビットの値が「０」でなければ、一致記号列がある場合の符号である。一致記号列がある場合の符号であれば、処理がステップＳ１２２に進められる。また一致記号列がない場合の符号であれば、処理がステップＳ１２４に進められる。
【０１０９】
［ステップＳ１２２］一致記号列がある場合の符号であれば、符号解析部１３１は、取得した符号から、相対ブロック数、シフトバイト数、ストアブロック数、およびストアバイト数を取得する。
【０１１０】
［ステップＳ１２３］ブロック取得部１３２は、次に復元した記号の格納位置（現在位置）を含むブロックから相対ブロック数前の復元されたブロックを、復元データ記憶部１４０から取得する。ブロック取得部１３２は、取得したブロックをレジスタ群１３３に格納する。その後、処理がステップＳ１２６に進められる。
【０１１１】
［ステップＳ１２４］一致記号列がない場合の符号であれば、符号解析部１３１は、取得した符号から、シフトバイト数、ストアブロック数、およびストアバイト数を取得する。
【０１１２】
［ステップＳ１２５］ブロック取得部１３２は、取得した符号に続けて圧縮データ記憶部１２０に格納されている記号列を、ブロック単位で取得する。ブロック取得部１３２は、取得したブロックをレジスタ群１３３に格納する。
【０１１３】
［ステップＳ１２６］記号列生成部１３４は、レジスタ群１３３内で、記号列のシフトやマージ処理を行い、符号に対応する記号列を復元する。そしてブロック出力部１３５は、復元された記号列を、ブロック単位で復元データ記憶部１４０に格納する。
【０１１４】
［ステップＳ１２７］符号解析部１３１は、圧縮データの復元が終了したか否かを判断する。復元が終了した場合、処理が終了する。復元が終了していなければ、処理がステップＳ１２１に進められる。
【０１１５】
このようにして、圧縮データから元のデータを復元することができる。なお、第２の実施の形態では、レジスタ群１３３内での記号列のシフトやマージ処理によって、記号列を復元することができる。
【０１１６】
図１１は、レジスタ群を用いた復元手順の一例を示す図である。図１１の例では、レジスタ群１３３内のレジスタを３つの用途で用いている。
ロード用レジスタ４１，４２は、ブロック取得部１３２が取得したブロック単位の記号列を格納するレジスタである。例えば８バイトの２つのレジスタが、ロード用レジスタ４１，４２として使用される。
【０１１７】
マージ用レジスタ４３は、記号列の結合に使用するレジスタである。例えば、１６バイトの１つのレジスタが、マージ用レジスタ４３として使用される。
未ストアバッファ４４は、復元された記号列のうち、復元データ記憶部１４０に格納されていない記号列を格納しておくバッファである。例えば８バイトの１つのレジスタが、未ストアバッファ４４として使用される。
【０１１８】
ここで、符号Ｃ４を復元に基づいて記号列を復元する場合を想定して、復元手順を説明する。なお、符号Ｃ４を復元するときには、圧縮データ３２における符号Ｃ４より前の符号はすでに復元され、ブロック単位で復元データ３３の記憶領域に格納されている。また、未ストアバッファ４４には、それまでの復元処理によって記号列が格納されている。未ストアバッファ４４内の記号列のうち、直前の符号Ｃ３のストアバイト数「７」で示されるバイト数分の記号列が、復元された記号列である。図１１の例では、「ｍｐｒｅｓｓ  」の記号列が、復元された記号列である。
【０１１９】
符号Ｃ４に基づいてデータを復元する場合、まず、符号Ｃ４の相対ブロック数に基づいて、ブロック単位で記号列が取得される。例えば符号Ｃ４の相対ブロック数は「２」であるため、復元データ３３から、次にブロックを格納するアドレス「２」よりも、２つ前のアドレス「０」のブロックが取得される。図１１の例では、符号Ｃ４の復元のために、２つのブロックが取得されている。取得されたブロックは、ロード用レジスタ４１，４２に格納される。なおロード用レジスタ４１，４２への複数のブロックの格納は、同時でなくてもよい。例えば、図１１におけるアドレス「０」のブロックをロード用レジスタ４１に格納し、その後のシフト・マージ処理、復元されたブロックの格納処理を行うこともできる。このとき、復元されたブロック数がストアブロック数に満たない場合に、次のブロックがロード用レジスタ４１に書き込まれる。
【０１２０】
そしてロード用レジスタ４１，４２内の記号列と、未ストアバッファ４４内の記号列とが、マージ用レジスタ４３内でマージされる。このとき、未ストアバッファ４４内の先頭から、直前の符号Ｃ３に示されるストアバイト数（７バイト）分の記号列が、マージ用レジスタ４３の先頭にコピーされる。そしてロード用レジスタ４１，４２内の記号列が、符号Ｃ４のシフトバイト数「４」分右にシフトされ、未ストアバッファ４４の記号列が格納されていない領域にコピーされる。例えば、ロード用レジスタ４１の４バイト目の記号「ｐ」は、４バイトシフトされることで、マージ用レジスタ４３内の８バイト目に格納される。ロード用レジスタ４１の最初の３バイト分の記号列「ｃｏｍ」は、４バイトシフトした位置が、未ストアバッファ４４内のコピー対象の記号列の格納領域と重なるためコピーされない。
【０１２１】
記号列のマージ処理が終了すると、復元が完了したブロックが、復元データ３３に追加される。図１１の例では、符号Ｃ４のストアブロック数は「１」である。そこでマージ処理が完了すると、マージ用レジスタ４３の先頭から１ブロックが、復元データ３３に追加される。またマージ用レジスタ４３内に復元された記号列のうち、１ブロック分に満たない記号列は、未ストアバッファ４４に格納される。符号Ｃ４のストアバイト数は「７」であることから、未ストアバッファ４４に格納された記号列のうち、先頭から７バイト分の記号列のみが、復元された記号列であることがわかる。
【０１２２】
このようにして、ブロック単位で記号列を取得し、レジスタ群１３３内の簡単な操作によってブロック単位でデータを復元し、復元したデータを格納することができる。
次に、レジスタ内での記号列の操作を含めた、圧縮・復元の詳細な処理手順について説明する。
【０１２３】
図１２は、レジスタを効率的に利用した圧縮処理の手順の一例を示すフローチャートである。
［ステップＳ２０１］データ取得部１１１が圧縮対象のデータをバッファ１１２に格納すると共に、一致検出部１１３がパラメータを初期化する。初期化されるパラメータは、以下の通りである。
current＿p=0
code＿p=0
literal＿num=0
pre＿storeB=0
「current＿p」は、現在、一致・不一致の探索対象となっている記号の位置が、圧縮対象データ３１の何バイト目かを示している。「code＿p」は、生成した符号の圧縮データ３２内での格納位置が、圧縮データ３２の何バイト目かを示している。「literal＿num」は、一致する記号列なしと判定された記号列の長さを示している。「pre＿storeB」は、直前の符号の復元により未ストアバッファ４４に格納された、記号列のバイト数（現在のストアバイト数）を示している。
【０１２４】
［ステップＳ２０２］一致検出部１１３は、「current＿p」で示される記号を先頭とする記号列に一致する記号列を、参照部１１２ａから探索する。該当する記号列が見つかった場合、一致検出部１１３は、一致する記号列の長さを「match＿len」に設定すると共に、参照部１１２ａ内で一致する記号列の先頭の位置を「match＿p」に設定する。
【０１２５】
［ステップＳ２０３］一致検出部１１３は、ステップＳ２０２の探索で、一致する記号列が見つかったか否かを判断する。一致する記号列が見つかった場合、処理がステップＳ２０５に進められる。一致する記号列が見つからなかった場合、処理がステップＳ２０４に進められる。
【０１２６】
［ステップＳ２０４］一致検出部１１３は、「literal＿num」の値をインクリメント（１加算）する。また一致検出部１１３は、「current＿p」の値をインクリメントする。その後、処理がステップＳ２０２に進められる。
【０１２７】
［ステップＳ２０５］一致検出部１１３は、「literal＿num」の値が０か否かを判断する。「literal＿num」の値が０でない場合、不一致の記号列が存在する。この場合、処理がステップＳ２０６に進められ得。「literal＿num」の値が０の場合、不一致の記号列が存在しない。この場合、処理がステップＳ２１０に進められる。
【０１２８】
［ステップＳ２０６］シフトバイト数算出部１１５、ストアブロック数算出部１１６、ストアバイト数算出部１１７が、それぞれシフトバイト数、ストアブロック数、およびストアバイト数を算出する。
【０１２９】
シフトバイト数「shiftB」は、例えば以下の式で計算される。
shiftB=[8+｛(current＿p - literal＿num) % 8｝ - (code＿p + 2) % 8] % 8;  ・・・（１）
「＝」は代入演算子である。「％」は剰余を示す演算子である。「current＿p - literal＿num」は、不一致記号列の先頭の記号の位置を示している。「current＿p - literal＿num」を８で除算したときの剰余は、圧縮対象データ３１内での不一致記号列の先頭の記号のブロック内での位置を表している。「(code＿p + 2)」は、圧縮データ３２における不一致の場合の符号（２バイト）の次の位置を示しており、この位置が、不一致記号列の圧縮データ３２内での位置となる。「(code＿p + 2)」を８で除算した剰余は、圧縮データ３２内での不一致記号列の先頭の記号のブロック内での位置を表している。この式（１）により、圧縮対象データ３１内での不一致記号列の先頭の記号のブロック内での位置と、圧縮データ３２内での不一致記号列の先頭の記号のブロック内での位置との差分が、シフトバイト数「shiftB」に設定される。
【０１３０】
ストアブロック数「storeBL」は、例えば以下の式で計算される。
storeBL = (pre＿storeB + literal＿num) / 8;  ・・・（２）
「／」は、除算の商を計算する演算子である。
【０１３１】
ストアバイト数は「storeB」は、例えば以下の式で計算される。
storeB = (pre＿storeB + literal＿num) % 8;  ・・・（３）
［ステップＳ２０７］符号生成部１１８は、ステップＳ２０６で算出された値に基づいて、符号を生成する。例えば、符号生成部１１８は、以下の処理を行う。
CodeBuff[code＿p] = 0 | shiftB;  ・・・（４）
CodeBuff[code＿p+1] = storeBL<<3 | storeB;  ・・・（５）
「｜」は、論理和を示している。「＜＜」は、右側の数値分（バイト）の左シフトを示している。「CodeBuff[]」は、圧縮データ３２を格納するバッファ（圧縮データ記憶部１２０）を示している。例えば「CodeBuff[code＿p]」は、圧縮データ３２内の「code＿p」で示される記憶領域を示している。式（４）により、圧縮データ３２に、不一致符号とシフトバイト数とを示す１バイトの値（符号の前半）が設定される。式（４）で設定された値に続けて、式（５）により、ストアブロック数とストアバイト数とを示す１バイトの値（符号の後半）が設定される。その後、圧縮データ３２内での次の格納位置が、２バイト先に更新される。すなわち、「code＿p +=2」が実行される。「＋＝」は、左のパラメータへの右側の数値の加算を示している。
【０１３２】
［ステップＳ２０８］符号生成部１１８は、不一致記号列のうちの１つの記号を、圧縮データ３２にコピーする。例えば、以下の命令でコピーが行われる。
CodeBuff[code＿p] = OriBuff[current＿p - literal＿num];  ・・・（６）
「OriBuff[]」は、圧縮対象データ３１が格納されたバッファを示している。[]内の値により、バッファ内の記憶領域が特定される。式（６）により、不一致記号列のうちのコピーが未了の記号が、圧縮データ３２にコピーされる。その後、「literal＿num」がデクリメント（literal＿num --）される。また「code＿p」がインクリメントされ、圧縮データ３２内での次の格納位置が１バイト先に更新される（code＿p ++）。
【０１３３】
［ステップＳ２０９］符号生成部１１８は、不一致記号列のすべてのコピーが完了したか否かを判断する。例えば符号生成部１１８は、「literal＿num」が「０」になったか否かにより、不一致記号列のコピーの完了の有無を判断する。不一致記号列のコピーが完了していれば、処理がステップＳ２１０に進められる。不一致記号列のコピーが完了していなければ、処理がステップＳ２０８に進められる。
【０１３４】
［ステップＳ２１０］相対ブロック数算出部１１４、シフトバイト数算出部１１５、ストアブロック数算出部１１６、ストアバイト数算出部１１７が、それぞれ相対ブロック数、シフトバイト数、ストアブロック数、およびストアバイト数を算出する。
【０１３５】
相対ブロック数「relativeBL」は、例えば以下の式で計算される。
relativeBL = (current＿p % 8) - (match＿p % 8);  ・・・（７）
「(current＿p % 8)」により、符号化部１１２ｂ内の一致した記号列の先頭の記号を含むブロックのアドレスが得られる。「(match＿p % 8)」により、参照部１１２ａ内の一致した記号列の先頭の記号を含むブロックのアドレスが得られる。式（７）により、それらのアドレスの差分が得られる。
【０１３６】
シフトバイト数「shiftB」は、例えば以下の式で計算される。
shiftB = ｛8+(current＿p % 8) - (match＿p % 8)｝ % 8;  ・・・（８）
ストアブロック数「storeBL」は、例えば以下の式で計算される。
storeBL = (pre＿storeB + match＿len) / 8;  ・・・（９）
ストアバイト数「storeB」は、例えば以下の式で計算される。
storeB = (pre＿storeB + match＿len) % 8;  ・・・（１０）
［ステップＳ２１１］符号生成部１１８は、ステップＳ２１０で算出された値に基づいて、符号を生成する。例えば、符号生成部１１８は、以下の処理を行う。
CodeBuff[code＿p] = (relativeBL<<3) | shiftB;  ・・・（１１）
CodeBuff[code＿p+1] = (storeBL<<3) | storeB;  ・・・（１２）
式（１１）により、圧縮データ３２に、相対ブロック数とシフトバイト数とを示す１バイトの値（符号の前半）が設定される。式（１１）で設定された値に続けて、式（１２）により、ストアブロック数とストアバイト数とを示す１バイトの値（符号の後半）が設定される。さらに、現在のストアバイト数「pre＿storeB」に、ストアバイト数「storeB」が設定される（pre＿storeB = storeB）。その後、圧縮データ３２内での次の格納位置が、２バイト先に更新される（code＿p +=2）。また「current＿p」に、一致する記号列の長さ「match＿len」が加算される（current＿p += match＿len）。
【０１３７】
［ステップＳ２１２］一致検出部１１３は、すべての圧縮データの圧縮が終了したか否かを判断する。圧縮が終了した場合、圧縮処理が終了する。圧縮が終了していなければ、処理がステップＳ２０２に進められる。
【０１３８】
このように、レジスタを効率的に利用して、データを圧縮することができる。次に、データのレジスタを効率的に利用した復元処理について詳細に説明する。
図１３は、レジスタを効率的に利用した復元処理の手順の一例を示すフローチャートである。
【０１３９】
［ステップＳ２２１］符号解析部１３１は、パラメータを初期化する。初期化されるパラメータは、以下の通りである。
ori＿p8 = 0
code＿p = 0
pre＿storeB = 0
「ori＿p8」は、復元データ３３における、次に復元するブロックのアドレスを示す。「code＿p」は、次に復元する符号の位置を示す。
【０１４０】
［ステップＳ２２２］符号解析部１３１は、復元する符号に不一致符号が設定されているか否かを判断する。例えば符号解析部１３１は、「code＿p」で示される圧縮データ３２内の値（符号の前半１バイト）を右に３ビットシフトした値が「０」か否かによって、不一致符号の有無を判定する（(CodeBuff[code＿p] >> 3) != 0）。不一致符号が設定されていれば、処理がステップＳ２２５に進められる。不一致符号が設定されていなければ、処理がステップＳ２２３に進められる。
【０１４１】
［ステップＳ２２３］不一致符号が設定されていない場合、符号解析部１３１は、復元する符号から、相対ブロック数、シフトバイト数、ストアブロック数、およびストアバイト数を取得する。例えば、符号解析部１３１は、以下の命令を実行する。
relativeBL = CodeBuff[code＿p] >> 3;  ・・・（１３）
shiftB = CodeBuff[code＿p] & 0x07;  ・・・（１４）
storeBL = CodeBuff[code＿p+1] >> 3;  ・・・（１５）
storeB = CodeBuff[code＿p+1] & 0x07;  ・・・（１６）
「＞＞」は、右側の数値分（バイト）の右シフトを示している。「＆」は、論理積の演算子である。式（１３）では、「CodeBuff[code＿p] >> 3」により、符号の前半の１バイトが右に３ビットシフトされ、上位５ビットの値のみが残される。残された５ビットで示される値が、相対ブロック数（relativeBL）に設定される。式（１４）では、「CodeBuff[code＿p] & 0x07」により、符号の前半１バイトの値と、上位５ビットが「０」であり下位３ビットが「１」のビット列との、ビットごとの論理和演算が行われる。これにより、符号の前半１バイトの下位３ビットの値みが残される。残された３ビットで示される値が、シフトバイト数（shiftB）に設定される。式（１５）では、「CodeBuff[code＿p+1] >> 3」により、符号の後半の１バイトが右に３ビットシフトされ、上位５ビットの値のみが残される。残された５ビットで示される値が、ストアブロック数（storeBL）に設定される。式（１６）では、「CodeBuff[code＿p+1] & 0x07」により、符号の後半の１バイトの値と、上位５ビットが「０」であり下位３ビットが「１」のビット列との、ビットごとの論理和演算が行われる。これにより、符号の後半１バイトの下位３ビットの値のみが残される。残された３ビットで示される値が、ストアバイト数（storeB）に設定される。その後、「code＿p」で示す位置が、２バイト分先に進められる（code＿p += 2）。
【０１４２】
［ステップＳ２２４］ブロック取得部１３２は、復元データ３３内のコピー元のブロックのアドレスを、コピー元アドレス（copy＿p8）に設定する。例えばブロック取得部１３２は、以下の計算により、コピー元アドレス（copy＿p8）を設定する。
copy＿p8 = OriBuff8 + ori＿p8 -relativeBL;  ・・・（１７）
「OriBuff8」は、復元データ３３が格納された領域の先頭を示すポインタである。その後、処理がステップＳ２２７に進められる。
【０１４３】
［ステップＳ２２５］不一致符号が設定されている場合、符号解析部１３１は、復元する符号から、シフトバイト数、ストアブロック数、およびストアバイト数を取得する。その後、「code＿p」で示す位置が、２バイト分先に進められる（code＿p += 2）。
【０１４４】
［ステップＳ２２６］ブロック取得部１３２は、圧縮データ３２内のコピー元のブロックのアドレスを、コピー元アドレス（copy＿p8）を設定する。例えばブロック取得部１３２は、以下の計算により、コピー元アドレス（copy＿p8）を設定する。
copy＿p8 = CodeBuff8 + (code＿p / 8);  ・・・（１８）
「CodeBuff8」は、圧縮データ３２が格納された領域の先頭を示すポインタである。その後、「code＿p」で示す位置が、不一致記号列の次の符号の位置に進められる。例えば、以下の式により、「code＿p」が更新される。
code＿p+=storeBL*8+storeB-pre＿storeB;  ・・・（１９）
［ステップＳ２２７］ブロック取得部１３２は、現在のストアバイト数（pre＿storeB）よりもシフトバイト数（shiftB）の方が大きいか否かを判断する。シフトバイト数（shiftB）の方が大きければ、処理がステップＳ２２８に進められる。現在のストアバイト数がシフトバイト数以上であれば、処理がステップＳ２２９に進められる。
【０１４５】
［ステップＳ２２８］ブロック取得部１３２は、コピー元アドレス（copy＿p8）で示す位置のブロックと次のブロックとを取得し、ロード用レジスタ４１，４２に格納する。そして記号列生成部１３４が、シフトバイト数分シフトさせた値を、マージ用レジスタ４３にコピーする。例えば、以下の命令により、ブロックの取得、シフト、およびコピーが行われる。
load＿data2 = *(copy＿p8); copy＿p8++;  ・・・（２０）
load＿data1 = *(copy＿p8); copy＿p8++;  ・・・（２１）
store＿data = ｛(load＿data2<<8*8) | load＿data1)｝>>(shiftB*8);  ・・・（２２）
「load＿data2」は、ロード用レジスタ４１への格納データを示す。「load＿data1」は、ロード用レジスタ４２への格納データを示す。「store＿data」は、マージ用レジスタ４３への格納データを示す。「*(copy＿p8)」は、「copy＿p8」で示される位置の１ブロックを取得することを示す。
【０１４６】
式（２０）により、コピー元の１ブロックが、ロード用レジスタ４１に格納される。「copy＿p8」で示されるアドレスをインクリメントして（copy＿p8++）、式（２１）の処理を行うことで、次の１ブロックが、ロード用レジスタ４２に格納される。その後、「copy＿p8」で示されるアドレスをインクリメントされる（copy＿p8++）。そして、式（２２）により、ロード用レジスタ４１の内容を１ブロック左シフトさせた値と、ロード用レジスタ４２の値とが結合され、さらにシフトバイト数分右にシフトした値が、マージ用レジスタ４３に設定される。その後、処理がステップＳ２３０に進められる。
【０１４７】
［ステップＳ２２９］ブロック取得部１３２は、コピー元アドレス（copy＿p8）で示す位置のブロックを取得し、ロード用レジスタ４２に格納する。そして記号列生成部１３４が、シフトバイト数分シフトさせた値を、マージ用レジスタ４３にコピーする。例えば、以下の命令により、ブロックの取得、シフト、およびコピーが行われる。
load＿data1 = *(copy＿p8);copy＿p8++;  ・・・（２３）
store＿data = load＿data1>>(shiftB*8);  ・・・（２４）
［ステップＳ２３０］記号列生成部１３４は、マージ用レジスタ４３に格納した記号列と、未ストアバッファ４４内の記号列とをマージする。例えば、以下の命令により、マージ処理を行うことができる。
store＿data = (BLBuff & MASK1[pre＿storeB])|(store＿data & MASK2[pre＿storeB]);
・・・（２５）
「BLBuff」は、未ストアバッファ４４の格納データを示す。「MASK1[]」は、以下のようなマスクデータである。
MASK1[] = ｛0x00 00 00 00 00 00 00 00,
0xFF 00 00 00 00 00 00 00,
0xFF FF 00 00 00 00 00 00,
0xFF FF FF 00 00 00 00 00,
...
0xFF FF FF FF FF FF FF FF｝
「MASK1[pre＿storeB]」により、現在のストアバイト数（pre＿storeB）に応じたマスクデータが得られる。例えば、現在のストアバイト数（pre＿storeB）が「７」であれば、「MASK1[pre＿storeB]」は、「0xFF FF FF FF FF FF FF 00」となる。「BLBuff & MASK1[pre＿storeB]」によって、未ストアバッファ４４から、ストアバイト数分の記号列が抽出される。
【０１４８】
「MASK2[]」は、以下のようなマスクデータである。
MASK2[] = ｛0xFF FF FF FF FF FF FF FF,
0x00 FF FF FF FF FF FF FF,
...
0x00 00 00 00 00 00 00 00｝
「MASK2[pre＿storeB]」により、現在のストアバイト数（pre＿storeB）に応じたマスクデータが得られる。例えば、現在のストアバイト数（pre＿storeB）が「７」であれば、「MASK2[pre＿storeB]」は、「0x00 00 00 00 00 00 00 FF」となる。「store＿data & MASK2[pre＿storeB]」によって、マージ用レジスタ４３の先頭から、ストアバイト数分の記号列が消去される。従って、式（２５）により、ロード用レジスタ４１，４２からマージ用レジスタ４３にコピーされた記号列と、未ストアバッファ４４内のストアバイト数分の記号列とがマージされる。
【０１４９】
［ステップＳ２３１］記号列生成部１３４は、ストアブロック数（storeBL）が０より大きいか否かを判断する。ストアブロック数が０より大きければ、処理がステップＳ２３２に進められる。またストアブロック数が０以下であれば、処理がステップＳ２３４に進められる。
【０１５０】
［ステップＳ２３２］ブロック出力部１３５は、１ブロック分の記号列を復元データ３３に追加する。例えば、以下の命令で、マージ用レジスタ４３の先頭の１ブロックが、復元データ３３に追加される。
OriBuff8[ori＿p8] = store＿data;  ・・・（２６）
その後、「ori＿p8」の値がインクリメントされ（ori＿p8 ++;）、「storeBL」の値がデクリメントされる（storeBL --;）。
【０１５１】
［ステップＳ２３３］記号列生成部１３４は、コピー元の次のブロックを取得し、先に取得したブロックとマージする。そして記号列生成部１３４は、シフトバイト数分だけ、マージ用レジスタ４３内の記号列を右にシフトする。このような処理は、例えば、以下の命令で実行される。
load＿data2 = *(copy＿p8);copy＿p8++;  ・・・（２７）
store＿data = ｛(load＿data1<<8*8) | load＿data2)｝>>(shiftB*8);  ・・・（２８）
load＿data1 = load＿data2;  ・・・（２９）
式（２７）により、次のブロックがロード用レジスタ４１に格納される。式（２８）により、ロード用レジスタ４２内を記号列が左に１ブロック分シフトした値と、ロード用レジスタ４１内の記号列とが、マージ用レジスタ４３内にコピーされる。そして、マージ用レジスタ４３内の記号列が、シフトバイト数分、右にシフトされる。式（２９）により、ロード用レジスタ４１内の記号列が、ロード用レジスタ４２にコピーされる。その後、処理がステップＳ２３１に進められる。
【０１５２】
［ステップＳ２３４］ストアブロック数が０以下になると、記号列生成部１３４は、マージ用レジスタ４３の先頭の１ブロック分の記号列を、未ストアバッファ４４に格納する。また記号列生成部１３４は、ストアバイト数（storeB）を、現在のストアバイト数（pre＿storeB）に設定する。例えば、以下の命令が実行される。
BLBuff = store＿data;  ・・・（３０）
pre＿storeB = storeB;  ・・・（３１）
［ステップＳ２３５］符号解析部１３１は、圧縮データ３２の復元が終了したか否かを判断する。例えば符号解析部１３１は、最後の符号の解析が終了した場合、復元が終了したと判断する。復元が終了した場合、ブロック出力部１３５が、未ストアバッファ４４内の先頭からストアバイト数分の記号列を復元データ３３に追加し、復元処理を終了する。復元が終了していなければ、処理がステップＳ２２２に進められる。
【０１５３】
このようにして、レジスタを効率的に利用して、データを復元することができる。
以上説明したように、第２の実施の形態では、コピー元の記号列が属するブロックを相対ブロック数で指定しているため、データ復元時における復元データ３３へのアクセスを、ブロック単位で行うことができる。これにより、コピー元の符号を符号（バイト）単位で読み出す場合に比べ、メモリアクセス回数を低減させることができる。その結果、データ復号処理時間が短縮される。
【０１５４】
さらに、ブロック単位で読み出した記号列について、レジスタ内でシフト・マージといった簡単な処理を行うだけで、データを復元できる。しかも、符号内にシフト量などの情報が付加されているため、復元時にシフト量を計算する必要がなく、データ復元をさらに高速に行うことができる。
【０１５５】
さらに、符号にストアブロック数やストアバイト数が含まれているため、コピーした記号列のどの範囲が復元されたデータなのかを、余分な計算を行わずに把握できる。そのため、復元時の処理負荷が軽減され、高速にデータを復元することができる。
【０１５６】
〔その他の応用例〕
第２の実施の形態では、圧縮データ３２の１つのブロックに、符号と不一致記号列とが混在している。そのため圧縮データからの符号の読み出しは、符号ごとに行っている。そこで、データ圧縮の際に、１つのブロックに符号をまとめて格納することで、圧縮データ３２からの符号の読み出しも、ブロック単位で行うことが可能となる。
【０１５７】
図１４は、圧縮データの一例を示す図である。図１４に示す圧縮データ３２ａでは、アドレス「０」のブロックに、４つの符号Ｃ１〜Ｃ４が格納されている。データの復元時には、例えば復元部１３０が、アドレス「０」のブロックを読み出し、レジスタに格納する。そして復元部１３０は、そのレジスタから符号を順番に解析し、データを復元することができる。また、アドレス「１」のブロックには、不一致記号列のみが格納されており、符号は格納されていない。データの復元時に不一致記号列を圧縮データ３２ａから読み出す際に、ブロック単位で読み出せば、そのブロックには不必要な符号が含まれないため、不一致記号列の読み出し効率が向上する。
【０１５８】
また、第２の実施の形態では、圧縮部１１０と復元部１３０とをコンピュータ１００で実現するものとしているが、圧縮部１１０または復元部１３０を、電子回路で構成することもできる。
【０１５９】
なお、符号に設定する値を変更することも可能である。例えば相対ブロック数に代えて、参照部（辞書）の先頭からのブロック数を用いることもできる。この場合、参照部に含まれるブロック数から、符号に示されるブロック数番目のブロックに、一致した記号列の先頭の記号が含まれる。
【０１６０】
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の２以上の構成（特徴）を組み合わせたものであってもよい。
【符号の説明】
【０１６１】
１  データ
１ａ  第１の記号列
１ｂ  第２の記号列
１ｃ  第３の記号列
１−１〜１−３  ブロック
２  データ圧縮装置
２ａ  探索手段
２ｂ  符号化手段
３  記録媒体
３ａ  圧縮データ
４  データ復元装置
４ａ  符号取得手段
４ｂａ，４ｂｂ  レジスタ
４ｂ  復元手段
５  記憶手段
５ａ  復元データ
【図１】
2014183551.tif 000003
【図２】
2014183551.tif 000004
【図３】
2014183551.tif 000005
【図４】
2014183551.tif 000006
【図５】
2014183551.tif 000007
【図６】
2014183551.tif 000008
【図７】
2014183551.tif 000009
【図８】
2014183551.tif 000010
【図９】
2014183551.tif 000011
【図１０】
2014183551.tif 000012
【図１１】
2014183551.tif 000013
【図１２】
2014183551.tif 000014
【図１３】
2014183551.tif 000015
【図１４】
2014183551.tif 000016