(57)【特許請求の範囲】
【請求項１】
入力装置から圧縮対象のデータを読み込むデータ読込部と、圧縮対象のデータを分割するブロック特定部と、分割されたブロックの文字列データを他のブロックの文字列と比較することで圧縮可能部分を探索する圧縮部分探索部を備え、
前記ブロック特定部は、圧縮対象の文字列の中から予め指定したバイト数の検索対象文字列を順次読み込むと共に、予め指定されたバイト数の指定文字列を取得し、これらを記憶する記憶部と、この記憶部に記憶されている検索対象文字列の中から前記指定文字列と同一の文字列を検索する検索部と、前記検索部による検索結果に従い圧縮対象の文字列をブロック化する分割処理部とを有し、
前記分割処理部は、
(1) 同一の文字列が発見された場合は、発見された文字列の直前までを１ブロックとする。
(2) 前記(1) において、発見された文字列部分で２文字連続して同じ文字が続く場合は、連続した２文字の間までを１ブロックとする。
(3) 同一の文字列が発見されなかった場合は、検索対象文字列の全体を１ブロックとする。
という条件で、しかも、前記(2) (1) (3) の優先順序に従って、圧縮対象の文字列をブロック化するものであり、
前記圧縮部分探索部は、前記分割処理部によって分割された各ブロック間の文字列を比較することで、冗長性除去による圧縮とランレングス圧縮を行うことを特徴とするデータ圧縮装置。
【請求項２】
圧縮対象の文字列の中から予め指定したバイト数の検索対象文字列を順次読み込む処理と、
前記検索対象文字列の中から、予め指定されたバイト数の指定文字列と同一の文字列を検索する処理と、
前記検索処理の結果、
(1) 同一の文字列が発見された場合は、発見された文字列の直前までを１ブロックとする。
(2) 前記(1) において、発見された文字列部分で２文字連続して同じ文字が続く場合は、連続した２文字の間までを１ブロックとする。
(3) 同一の文字列が発見されなかった場合は、検索対象文字列の全体を１ブロックとする。
という条件を、前記(2) (1) (3) の優先順序に従って適用することにより、圧縮対象の文字列をブロック化する処理と、
前記分割された各ブロック間の文字列を比較することで、冗長性除去による圧縮とランレングス圧縮を行うことを特徴とするデータ圧縮方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ容量や、ＣＰＵの処理能力に制限のあるコンピュータシステムに適したデータ圧縮方法及び装置に関する。
【背景技術】
【０００２】
データの圧縮アルゴリズムとして、ハッシュ値を用いた辞書や、ハフマン符号による圧縮アルゴリズムが考案されてきた。また、冗長部分を探索するために、スライドウインドウを形成して処理していたが、このような処理は、データを繰り返し比較しなければならないので、大きなメモリやＣＰＵ処理能力を必要とする。このためメモリ容量や、ＣＰＵの処理能力に制限のある組み込み型のコンピュータシステムに採用することは難しいという課題があった。
【０００３】
例えば、特許文献１は、辞書式の一例であって、過去に出現したデータ系列の中から一致する最大長の部分列を探索して、その部分列の位置と一致長を符号化して出力するものであり、過去に出現したデータ系列は辞書に登録する。すなわち、サンプルデータ中に出現する文字列を先頭のｎ文字が等しい文字列のグループに分類した後、各グループから最頻出文字列を検出し、該検出した最頻出文字列を辞書に登録する。
【０００４】
特許文献２は、辞書式の他の例であって、入力されたテキストデータを複数のブロックに分割し、文字列と符号とが対応付けられて格納された基準辞書に基づき、処理対象ブロックに出現する文字列のうち、基準辞書に登録されていない文字列と、基準辞書において処理対象ブロックに出現しない文字列に対応付けられた符号とを対応付けた差分辞書を生成する。そして、作成した差分辞書と基準辞書とに基づいて生成した処理対象辞書を参照し、処理対象ブロックに出現する文字列を対応する符号に置き換える。
【０００５】
特許文献３は、ランレングス式の一例であって、データを複数のブロック単位に分割し、分割された１ブロック中の１データを基準データとして、当該ブロック内の隣接するデータ間の差分データを算出する。算出された差分データの絶対値における有効絶対値から圧縮後のデータのデータ長を算出し、算出されたデータ長に基づいて複数の圧縮データを生成する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００７−１２４５６１号公報
【特許文献２】特開２０１１−１１４５４６号公報
【特許文献３】特開２００９−２０７０６４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
前記の特許文献１や２のような辞書式やハフマン符号などの従来技術は、圧縮対象のデータの格納メモリとは別に、大きなメモリ容量や高い処理能力を有するＣＰＵが必要である。そのため、メモリ容量や高い処理能力のＣＰＵを持つことのできない組み込み型コンピュータシステムにおいては、従来のデータ圧縮技術を採用することは不可能であり、データ圧縮を行わずに通信を行ったり蓄積を行ったりしていた。このため、高効率の通信や、蓄積を行うことができなかった。
【０００８】
特許文献３のように、対象となるデータをブロックに分割したランレングスによる圧縮は簡便ではあるが、圧縮効率が悪いという欠点があった。
【０００９】
本発明は、上記のような従来技術の課題を解決するもので、その目的は辞書方式やハフマン符号方式、スライドウインドウを用いることなく、少ないメモリ容量と低い処理能力のＣＰＵによっても、高い圧縮効率を実現することができるデータ圧縮方法及び装置を提供することにある。
【課題を解決するための手段】
【００１０】
上記の目的を達成するために、本発明のデータ圧縮方法及び装置は、次のような特徴を有する。
（Ａ）入力装置から圧縮対象のデータを読み込むデータ読込部と、圧縮対象のデータを分割するブロック特定部と、分割されたブロックの文字列データを他のブロックの文字列と比較することで圧縮可能部分を探索する圧縮部分探索部を備える。
（Ｂ）前記ブロック特定部は、圧縮対象の文字列の中から予め指定したバイト数の検索対象文字列を順次読み込むと共に、予め指定されたバイト数の指定文字列を取得し、これらを記憶する記憶部と、この記憶部に記憶されている検索対象文字列の中から前記指定文字列と同一の文字列を検索する検索部と、前記検索部による検索結果に従い圧縮対象の文字列をブロック化する分割処理部とを有する。
（Ｃ）前記分割処理部は、
(1) 同一の文字列が発見された場合は、発見された文字列の直前までを１ブロックとする。
(2) 前記(1) において、発見された文字列部分で２文字連続して同じ文字が続く場合は、連続した２文字の間までを１ブロックとする。
(3) 同一の文字列が発見されなかった場合は、検索対象文字列の全体を１ブロックとする。
という条件で、しかも、前記(2) (1) (3) の優先順序に従って、圧縮対象の文字列をブロック化する。
（Ｄ）前記圧縮部分探索部は、前記分割処理部によって分割された各ブロック間の文字列を比較することで、冗長性除去による圧縮とランレングス圧縮を行う。
【００１１】
また、本発明のデータ圧縮方法は、次のような処理を順次行うことを特徴とする。
（Ａ）圧縮対象の文字列の中から予め指定したバイト数の検索対象文字列を順次読み込む。
（Ｂ）前記検索対象文字列の中から、予め指定されたバイト数の指定文字列と同一の文字列を検索する。
（Ｃ）前記検索処理の結果、
(1) 同一の文字列が発見された場合は、発見された文字列の直前までを１ブロックとする。
(2) 前記(1) において、発見された文字列部分で２文字連続して同じ文字が続く場合は、連続した２文字の間までを１ブロックとする。
(3) 同一の文字列が発見されなかった場合は、検索対象文字列の全体を１ブロックとする。
という条件を、前記(2) (1) (3) の優先順序に従って適用することにより、圧縮対象の文字列をブロック化する。
（Ｄ）前記分割された各ブロック間の文字列を比較することで、冗長性除去による圧縮とランレングス圧縮を行う
【発明の効果】
【００１２】
本発明によれば、圧縮対象の文字列をブロック化することで、各ブロックの内容に応じて、冗長性除去による圧縮とランレングス圧縮の２つの圧縮方法を採用することが可能になり、メモリの少ないまたは処理能力の低い組み込み型コンピュータシステムにおいても高い圧縮率を得ることができるデータ圧縮方法及び装置を提供することが可能となる。
【図面の簡単な説明】
【００１３】
【図１】本発明の第１実施形態に係るデータ圧縮装置を示すブロック図である。
【図２】第１実施形態におけるデータ圧縮方法の全体構成を示すフローチャートである。
【図３】第１実施形態における１ブロックの探索処理を示すフローチャートである。
【図４】第１実施形態における最大冗長度の探索処理を示すフローチャートである。
【図５】第１実施形態における１ブロックの探索処理を説明するデータ構成図である。
【図６】第１実施形態における最大冗長度の探索処理を説明するデータ構成図である。
【図７】第２実施形態における１ブロックの探索処理を示すフローチャートである。
【図８】第２実施形態における１ブロックの探索処理を説明するデータ構成図である。
【図９】図７のフローチャートにおける文字列の探索処理の一例を示すデータ構造図である。
【図１０】図７のフローチャートにおける文字列の探索処理の他の例を示すデータ構造図である。
【発明を実施するための形態】
【００１４】
１．第１実施形態
以下、本発明の実施形態を、図１及び図２に従って説明する。
【００１５】
［構成］
本実施形態のデータ圧縮装置は、データの圧縮処理を行う圧縮処理部１、対象のデータを入力する入力装置２、圧縮後のデータを出力する出力装置３、及びこれらを制御する制御部４とから構成されている。
【００１６】
圧縮処理部１は、入力装置２から圧縮対象のデータを読み込むデータ読込部１１、読み込んだ圧縮対象のデータや圧縮処理の過程で記憶すべき各種の情報を記憶する記憶部１２を備えている。圧縮処理部１は、圧縮対象のデータを所定の条件に従って分割するブロック特定部１３、分割されたブロックの文字列データを他のブロックの文字列と比較することで圧縮可能部分を探索する圧縮部分探索部１４及び出力バッファ１５を備えている。
【００１７】
データ読込部１１は、制御部４からの指示に基づいて、入力装置２から文字データを読み込むものである。本実施形態において、圧縮対象の文字データとしては、例えば、各種機器の設定値、計測値、制御コマンドなど、数字、アルファベットその他複数種類の文字が連続した文字列データが用いられる。記憶部１２は、データ読込部１１が読み込んだ文字列データを一時的に保存するものであって、入力バッファとして使用される。
【００１８】
ブロック特定部１３は、圧縮対象のデータを図５に示すような下記の条件に従って、小さいブロックに分割する。
(1) 先頭の１バイトと同じ値（同じ文字）の位置の直前まで
(2) ２文字連続して同じ値（同じ文字）が続く場合、連続した２文字の間
（ただし、前記(1) と(2) の条件が重なる場合は、(2) を優先する）
(3) 前記(1) (2) の条件が満たされなかった場合は、予め決めておいた最大長を１ブロックとする。
【００１９】
なお、本実施形態では、前記(3) の最大長を１２８バイトとしたが、この値に限定されることなく、圧縮対象のデータの種類やハードウェアリソースに応じて適宜設定することができる。
【００２０】
このような処理を行うため、ブロック特定部１３は、圧縮対象の文字列の中から予め指定したバイト数の検索対象文字列を順次読み込むと共に、予め指定されたバイト数の指定文字列を取得し、これらを記憶する記憶部１３１と、この記憶部１３１に記憶されている検索対象文字列の中から前記指定文字列と同一の文字列を検索する検索部１３２と、前記検索部１３２による検索結果に従い圧縮対象の文字列をブロック化する分割処理部１３３とを有する。すなわち、この分割処理部１３３が、前記(1) から(3) に示す処理に従い、圧縮対象の文字列をブロック化し、その結果を圧縮部分探索部１４に出力する。
【００２１】
前記圧縮部分探索部１４は、記憶部１２に記憶されている圧縮対象の文字列の中から、圧縮対象部分を探索するものである。この圧縮部分探索部１４は、圧縮対象のデータを有するブロック（注目ブロックという）と、注目ブロックよりも前のブロックの文字列を比較して、同一の文字列の有無を探索する。
【００２２】
その場合、圧縮部分探索部１４は、図６に示すような次の２つの処理を行う。
(a) 前のブロックの先頭の１バイトから注目ブロックの文字列を比較する処理（冗長性除去による圧縮）
(b) 前のブロックの最後の１バイトと注目ブロックの文字列を比較する処理（ランレングス圧縮）
【００２３】
この場合、注目するブロックの前ブロック（前ブロックは複数あってよい）に対して、前ブロックの先頭及び最後のバイトのそれぞれと、注目するブロックの先頭からバイト単位のコンペアを行い一致する長さを最大６５５３６バイトまで求める（６５５３６という値は参考値である、ハードウエアリソースにより決める）。また、前ブロックに対して、ｎ個前のブロックに対しても一致サイズを求めてもよい。
【００２４】
圧縮部分探索部１４は、これらの一致サイズのあらかじめ決めておいたサイズ以上の中から最長の一致サイズを持つものを採用し、これを冗長ブロックとして、そのブロックの識別子と、先頭または最後の１バイトから文字列が一致することを、圧縮データとして出力バッファ１５に格納する。具体的には、圧縮部分探索部１４は、前記(a) (b) の処理の結果得られた情報、例えば圧縮対象となったブロックの識別子、圧縮部分が発見されたブロックが注目ブロックの何個前であるか、先頭／最終バイト、一致したバイト数（文字列の数）などを出力バッファ１５に書き出す機能を有する。
【００２５】
出力バッファ１５は、圧縮部分探索部１４からの圧縮部分に関する情報を一時的に記憶し、予め設定されたタイミングで外部の出力装置３に出力するものである。この出力バッファ１５は、ハードウェアとしては記憶部１２の一部に設けられていても良いが、本実施形態では、圧縮対象のデータを保存したり圧縮処理の途中で得られた情報を記憶する処理と、出力データに関する処理を区別するために、出力バッファ１５を独立して説明している。
【００２６】
［作用］
前記の様な構成を有する本実施形態の作用を、図２〜図４に示すフローチャートにより説明する。
【００２７】
（Ｉ）全体的な処理…図２
図２は、データ圧縮方法の全体的な処理を示すものである。この図２の処理は、記憶部１２に読み込んだ全データについて、１ブロックの探索処理と最大冗長度の探索処理を交互に行うことで、全データを１つずつ順番にブロック化しながらその都度最大冗長度の探索を行うものである。
【００２８】
なお、図２では、まず最大冗長度の探索を行い、その結果に従ってブロック化を実施するというループが示されているが、最初の１ブロックのみをまずブロック化して、その後、最大冗長度の探索と２ブロック目以降のブロック化を実行する様なループを有するフローチャートでも、同一の結果を得ることができる。
【００２９】
図２において、制御部４の指令に基づいて、圧縮処理部１のデータ読込部１１が、入力装置２から圧縮対象のデータを受信すると、そのデータは記憶部１２を構成するバッファ内に記憶される（ステップ２１）。この場合、データ読込部１１は、入力装置２からの全データを読み込んでも良いし、記憶部１２に先読みバッファを設けて、そこに最大ブロック長以上を読み込んでおいても良い。
【００３０】
次に、圧縮部分探索部１４は、記憶部１２に記憶されているデータの先頭の位置を注目点に設定し（ステップ２２）、この注目点からデータを構成する文字列中の圧縮部分、すなわち、連長圧縮及び冗長圧縮の対象となる部分があるか否かを探索する（ステップ２３）。この圧縮部分の探索は、制御部４が、圧縮処理部１に設けられた圧縮部分探索部１４を呼び出して、図４のフローチャートに示す処理を実行することにより行われる。なお、この圧縮部分探索の詳細は、後述する。
【００３１】
なお、読み込んだ全データの先頭位置（先頭バイト）を注目点とした最初の圧縮部分の探索処理は、データがブロック化されていないため、ステップ２３において圧縮部分を発見することはできない。この最初の探索処理やその後作成したブロックに対して探索処理を実施した結果、圧縮部分が発見されなかった場合は（ステップ２４のＮＯ）、図３のフローチャートに示す１ブロックの探索処理を呼び出して、次の１ブロックの特定処理を行う（ステップ２５）。なお、この１ブロックの特定処理の詳細は、後述する。
【００３２】
ステップ２５において、１ブロックの特定が行われた後は、見つけた１ブロックを無圧縮のブロックとして、その識別子とサイズ及びデータ部分を出力バッファ１５に書き出す（ステップ２６）。同時に、見つけた１ブロックの先頭の位置と長さを、次のループの圧縮部分探索のために記憶部１２に記憶する（ステップ２７）。
【００３３】
その後、出力バッファ１５のデータを出力装置３に書き出し（ステップ２８）、全データについてそのブロック化と圧縮部分の探索が終わったかを確認する（ステップ２９）。そして、すべてのデータについてブロック化と圧縮部分の探索が終わった場合には、データ圧縮処理を終了する（ステップ２９のＹＥＳ）。ブロック化と圧縮部分の探索するデータが残っている場合には、ステップ２３に戻って圧縮部分の探索処理を行う（ステップ２９のＮＯ）。
【００３４】
一方、前記ステップ２３において、圧縮部分の探索を行った結果、圧縮部分が発見された場合には（ステップ２４のＹＥＳ）、出力バッファ１５に次の情報を書き込む（ステップ３０）。
(1) 圧縮部分のブロックの識別子
(2) ブロックの先頭のバイトから圧縮部分を探索した冗長圧縮であるか、ブロックの最後のバイトから圧縮部分を探索した連長圧縮であるかの区別
(3) 圧縮の長さ
【００３５】
次いで、圧縮部分として処理した長さを１ブロックとして、そのブロックの先頭の位置と、ブロックの長さを記憶部１２に記憶する（ステップ３１）。この記憶した情報により、圧縮部分がなかったと判断して１ブロックの探索処理を行ったステップ２５の場合と同様に、そのループにおける１ブロックの特定が可能となる。
【００３６】
その後、ステップ３０で出力バッファ１５に書き込んだ(1) 〜(3) の情報を、出力バッファ１５から外部の出力装置３に書き出すことで、このループの処理を終了する。以下、ステップ２９において、すべてのループの処理が終わったか否かを確認して、全部のデータについて処理が終了した場合には、読込部１１によって読み込んだデータに対する圧縮処理を終了する。
【００３７】
（II）１ブロックの探索処理…図３
前記図２に示した全体処理のステップ２５で呼び出される１ブロックの探索処理について、図３に従って説明する。制御部４により、１ブロックの探索処理が呼び出されると、ブロック特定部１３が、記憶部１２に読み込まれている全データの中から、予め定めた１ブロックの最大長分のデータ（本実施形態では１２８バイト）を読み込む（ステップ３１）。
【００３８】
次いで、ブロック特定部１３が、記憶部１２に記憶されているデータの先頭を注目点とし、その位置の値をc1に設定する。この注目点の位置の値＝c1は、先頭と同じ文字を有するバイトを見つけるためのものである（ステップ３２）。この状態で、設定された注目点の位置の値を示す変数cprvにc1を、ブロック長を示す変数nlenに1を代入する（cprv＝c1：nlen＝1：ステップ３３）。
【００３９】
前記のようにして注目点が設定された後、ブロック特定部１３は、注目点を１バイト進め、進んだ後の注目点の位置の値を変数ccurに代入する（ステップ３４）。次いで、１バイト進んだ注目点の位置の値ccurと、１バイト進む前の設定された注目点の位置の値cprvとを比較し、両者の値が等しい場合（ccur＝cprv）には（ステップ３５のＹＥＳ）、連続する２バイトを見付けたので、２文字連続して同じデータが続くとして、そこをブロックの切れ目とする（ステップ３６）。そして、ブロック長をその時点のnlenとする。この処理は、図５に示す１ブロックの探索処理を説明するデータ構造図中の(2)に相当する。
【００４０】
一方、１バイト進んだ注目点の位置の値ccurと、１バイト進む前の設定された注目点の位置の値cprvが異なる場合（ccur≠cprv）には（ステップ３５のＮＯ）、最初の注目点の位置の値c1と１バイト進んだ注目点の位置の値ccurとを比較する（ステップ３７）。両者の値が等しい場合は（ccur＝c1：ステップ３７のＹＥＳ）、１バイト進んだ注目点の次の位置の値cnxtを読み込み、これを１バイト進んだ注目点の位置の値ccurと比較する（ステップ３８）。
【００４１】
両者が等しい場合、すなわちccur＝cnxtの場合には（ステップ３８のＹＥＳ）、連続する２バイトを見付けたので、そこをブロックの切れ目とし、ブロック長をnlen+1とする（ステップ３９）。この処理は図５に示すデータ構造図中の(3)に相当する。
【００４２】
両者が異なる場合、すなわちccur≠cnxtの場合には（ステップ３８のＮＯ）、先頭の１バイト目と同じバイトを見付けたので、そこをブロックの切れ目とし、ブロック長をnlenとする（ステップ４０）。この処理は図５に示すデータ構造図中の１に相当する。このようにすることで、図５において、(1)と(2)の条件が重なる場合に、(2)を優先することができる。
【００４３】
前記ステップ３７において、最初の注目点の位置の値c1と１バイト進んだ注目点の位置の値ccurが異なる場合は（ccur≠c1：ステップ３７のＮＯ）、ブロック長をnlen＝nlen+1とし（ステップ４１）、すべてのバイトに対する処理が終了しているか否かを判定する（ステップ４２）。処理が終了していない場合には（ステップ４２のＮＯ）、再びステップ３４に戻り、注目点を１バイト進めてデータの最後のバイトまで前記の処理を繰り返す。
【００４４】
一方、処理が終了した場合には（ステップ４２のＹＥＳ）、記憶部１２に読み込んだデータ中には、図５の(1)〜(3)の条件を満たす文字列が見つからなかったとして、全データを１ブロックとする。すなわち、図５の(4)に示すように、予め決めておいた最大長を１ブロックとする。
【００４５】
このようにして、本実施形態では、ブロック特定部１３によって全データが１つあるいは複数のブロックに分割されるので、この処理が終了した後は、制御部４は、図２に示す全体処理のステップ２６に戻って圧縮処理を続行する。
【００４６】
（III）圧縮部分の探索
図２に示した全体処理のステップ２３で呼び出される圧縮部分の探索処理について、図４のフローチャートに従って説明する。
【００４７】
本実施形態において、図５に示すような条件でデータのブロック分けを行った場合に、ブロック間には以下のような特徴を持つ。
(a) 隣り合うブロックの先頭の１バイトが同じ値になることが多い。
(b) 前のブロックの最後の１バイトが、先頭のブロックの先頭の１バイトと同じ値になることが多い。そこで、本実施形態では、前記(a)の特徴に着目して、冗長圧縮を行い、(b)の特徴に着目して連長圧縮を行う。
【００４８】
冗長圧縮に関しては、圧縮部分探索部１４により、記憶部１２に記録されているブロック化されたデータについて、最終のブロックを注目ブロックに設定し、その注目ブロックの先頭のバイトを注目点に設定する（ステップ４１）。同時に、探索開始時の処理として、最大冗長度を示す長さデータの値をクリアする。
【００４９】
次に、注目点ブロックの１つ前のブロックに対して、注目点と１つ前のブロックの先頭のバイトからのデータの比較を行い、一致するデータの長さを求める（ステップ４２）。この処理は、図６に示すデータ構造図中の(1)の処理に相当する。
【００５０】
比較の結果、データの長さが今までのブロックで一致したデータの長さよりも長い場合（ステップ４３のＹＥＳ）は、そのブロックが注目ブロックの何個前のブロックであるか、及び今までより長い一致したデータの長さを記憶部１２に記憶する（ステップ４４）。
【００５１】
なお、注目ブロックの１つ前のブロックの場合には、ステップ４１で長さデータをクリアしているので、１つ前のブロックで一致した長さが一番長くなる。
【００５２】
このようにして、冗長圧縮の処理を行った後は、連長圧縮処理として、注目ブロックの最初のバイト（注目点）を開始点として、１つ前のブロックの最後のバイトと注目ブロックの各バイトとの比較を行い、一致する長さを求める（ステップ４５）。この処理は、図６に示すデータ構造図中の(2)の処理に相当する。
【００５３】
求めた長さが今までよりも長い場合には（ステップ４６のＹＥＳ）、そのブロックが注目ブロックの何個前のブロックであるか、及び今までより長い一致したデータの長さを記憶部１２に記憶する（ステップ４７）。
【００５４】
その後、探索対象のブロックを１つさかのぼる（ステップ４８）。そして、ループを繰り返す場合には（ステップ４９のＮＯ）、ステップ４２に戻って、前記の処理を繰り返す。
【００５５】
一方、さかのぼるブロックが存在しないか、予め指定しておいた回数分ブロックをさかのぼった場合は（ステップ４９のＹＥＳ）、ループを終了して、コール元である図２の圧縮処理のフローチャートのステップ２３に対して、一致した長さが最大のブロックの位置と、一致サイズを格納して、最大冗長度の探索処理を終了する。
【００５６】
この圧縮部分の探索処理において、ランレングス圧縮、冗長性探索のどちらも有効な圧縮ができなかった場合（すべてのループにおいて、ステップ４３及びステップ４６がＮＯ）には、圧縮できないブロックとして、識別子のデータを格納する。しかし、前ブロックの先頭バイトを同じバイトを持つブロックの場合には、それを示す識別子をおき、先頭バイトを格納しない。このことにより、ブロックのデータ長が十分小さい場合には、識別子分のデータを増やしてしまうことなくブロック情報で圧縮データの中に格納できる。
【００５７】
また、上記のどの方法にも当てはまらない場合には、識別子１バイト以上と圧縮していないデータを格納する。
【００５８】
このような処理を行う本実施形態では、注目ブロックの先頭バイトからの文字列と直前のブロックの最終バイトとの比較結果である連長圧縮が、ランレングス圧縮と同じ結果を生むことから、この方法により、ランレングス圧縮と、冗長性除去による圧縮の２つの圧縮方式の両方を実施できる。
【００５９】
また、全データ探索を行っていないためスライディングウインドウを用いた冗長性の探索よりは、探索の精度が落ちるが、大量のデータコンペアを行う必要が無いため、処理能力に制限のあるＣＰＵやメモリ容量が少ない機器においても、早い探索が可能である。
【００６０】
特に、本実施の形態において、ステップ４２及びステップ４５における文字列の比較処理は、ブロックを越えて予め定めた最大バイト（例えば６５５３６バイト）まで実施することができる。そのようにすれば、同じバイトが連続する場合最大サイズのデータを数バイトにまで圧縮できる。なお、この最大バイトは、ハードウェアのリソースなどにより適宜設定することができる。
【００６１】
２．第２実施形態
第２実施形態は、第１実施形態における１ブロックの探索処理を、別の条件で行うものである。すなわち、第１実施形態は１ブロックの探索処理を１バイトのデータを注目点として、同一のデータが存在しないか、あるいは同じ値のデータ（文字）が連続していないかを基準としてブロックを特定した。これに対して、第２実施形態は、複数バイト（複数文字）を注目点として探索を行い、ブロックを特定する。
【００６２】
具体的には、図８に示すように、次の処理を行う。
(1) 予め設定した指定バイト分（例えば１２８バイト）の文字列を検索対象として、１２８バイトの文字列中に予め定めた複数バイトの文字列、図８では３バイト（A,B,C）の文字列と同じパターンの文字列（A,B,C）が見つかるまで探索を行う。そして、予め定めた３バイトの文字列が（A,B,C）のように異なる文字で構成されている場合には、見つかった同じ文字列の前のバイトまでを１ブロックとする。
(2) 前記(1) と同様にして検索を行い、予め定めた３バイトの文字列が（A,A,A）のように同一の文字で構成されている場合には、見つかった同じ文字列の１番目と２番目の文字列の間までを１ブロックとする。
(3) 予め設定した指定バイト（例えば１２８バイト）中に、指定した３バイト分の文字列と同一の文字列が発見されなかった場合には、指定バイト（例えば１２８バイト）を１ブロックとする。
【００６３】
以下、本実施形態の処理を図７のフローチャート及び図９及び図１０のデータ構成図に従って説明する。
まず、ユーザが予め決めておいた注目点として探索を行う文字数（複数バイト）をcmax：＝指定文字列のバイト数として、予め記憶部１２に記憶させておく。本実施形態では、この文字数を３バイト（cmax：＝）とする。この状態で、記憶部１２のバッファに１ブロックの最大長分の文字列（例えば６５５３６バイト）を読み込む（ステップ７１）。
【００６４】
次に、初期値として、注目点p1をバッファの先頭（読み込んだ文字列の先頭）とし、探索開始場所を保持するための変数cpにバッファ先頭のバイトの位置を代入した後、注目点を１バイト進める（ステップ７２）。そして、ブロック長nlenに1を代入する（ステップ７３）。
【００６５】
次に、バッファ先頭cpから３バイト分の文字列と、バッファ先頭から１つ進んだ注目点p2から３バイト分の文字列を比較する（ステップ７４）。図９の例では、バッファ先頭cpからの３バイト分の文字列が（A,B,C）であり、バッファ先頭から１つ進んだ注目点p2から３バイト分の文字列が（B,C,D）であるから、ステップ７４の比較結果（ステップ７５）はＮＯである。
【００６６】
比較の結果、３バイト分の文字列が異なる場合には、注目点を次のバイトに移動すると共に、nlen＝nlen＋1としてブロック長を１つ加算する（ステップ７６）。この場合、図９の（３）に示すように、３バイト目を新たな注目点p3とする。その後、すべてのバイト（１２８バイト）に対する処理が終わったか否かの確認を行い（ステップ７７）、図９の（３）のように、処理すべきバイトが残っている場合には、ステップ７４に戻って次のバッファ先頭cpからの３バイト分の文字列（A,B,C）と、新たな注目点p3からの３バイト分の文字列（C,D,E）との比較を行う。
【００６７】
以下同様にして、注目点を進めるごとに３バイト分の文字列の比較を行い、n番目の注目点で３バイト分の文字列（A,B,C）が一致した場合（ステップ７５のＹＥＳ）は、フローチャート中のこのループから抜け出して、同一とされた３バイト分の文字列がすべて同じバイト（同じ文字）で構成されているかをチェックする（ステップ７８）。
【００６８】
図９では、３バイト分の文字列は（A,B,C）であり、異なるバイトから構成されているから（ステップ７９のＮＯ）、図９の（４）のように、注目点の位置を次のブロックの先頭とし、ブロック長をその時点でのnlenとして、１ブロックの分割処理を終了する（ステップ８０）。
【００６９】
一方、図１０は、３バイト分の文字列が同一の文字列（A,A,A）から構成されている場合のデータ構造図であって、図７のフローチャートにおいて、３バイト分の文字列がすべて同じ文字で構成されているかを検査する処理（ステップ７８）までは、図９の実施形態と同一である。
【００７０】
図１０の実施形態では、３バイト分の文字列が同一の文字列（A,A,A）から構成されているので（ステップ７９のＹＥＳ）、図１０の（４）に示すように、注目点pn＋１の位置を次のブロックの先頭とし、ブロック長nlen＝nlen＋１として、１ブロックの分割処理を終了する（ステップ８１）。
【００７１】
一方、図７のフローチャートのループにおいて、予め指定した１ブロックの最大長のバイト（１２８バイト）まで、バッファ先頭からの３バイト分の文字列と、順次ずらしていったすべての注目点からの３バイト分との文字列を比較しても、同一の文字列が発見できなかった場合は（ステップ７７のＹＥＳ）、予め指定した最大長のバイト数を１ブロックの長さ（ブロック長＝探索最大長）とする（ステップ８２）。
【００７２】
このようにして、第２実施形態においても、
(a) 隣り合うブロックの先頭の１バイトが同じ値になることが多い。
(b) 前のブロックの最後の１バイトが、先頭のブロックの先頭の１バイトと同じ値になることが多い。
という特徴を有するブロックに分割することができる。その結果、第２実施形態においても、前記(a)の特徴に着目して、冗長圧縮を行い、(b)の特徴に着目して連長圧縮を行うことが可能になる。
【００７３】
３．他の実施形態
本発明は、前記の実施形態に限定されるものではなく、下記のような他の実施形態も包含する。
【００７４】
（１）図示の実施形態は、記憶部１２に読み込んだ全データについて、１ブロックの探索処理と、最大冗長度の探索処理とを交互に行うことで、全データを１つずつブロック化しながら最大冗長度の探索を行ったものである。しかし、本発明は、この実施形態に限定されるものではなく、予め全データを複数のブロックに分割してから最大冗長度の探索処理を行うことも可能である。
【００７５】
（２）本発明の請求項において、予め指定するバイト数の文字列とは、第２実施形態のような複数の文字列に限らず、第１実施形態のような１バイト分の文字も包含する。
【００７６】
（３）本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【符号の説明】
【００７７】
１…圧縮処理部
２…入力装置
３…出力装置
４…制御部
１１…データ読込部
１２…記憶部
１３…ブロック特定部
１４…圧縮部分探索部
１５…出力バッファ
【図１】
0005778595.tif 000002
【図２】
0005778595.tif 000003
【図３】
0005778595.tif 000004
【図４】
0005778595.tif 000005
【図５】
0005778595.tif 000006
【図６】
0005778595.tif 000007
【図７】
0005778595.tif 000008
【図８】
0005778595.tif 000009
【図９】
0005778595.tif 000010
【図１０】
0005778595.tif 000011