【文献】
WenJun Huang et al.,A Lossless Data Compression Algorithm for Real-time Database,Intelligent Control and Automation, 2006. WCICA 2006. The Sixth World Congress on ,2006年 6月23日,Vol.2,pp.6645-6648
(58)【調査した分野】(Int.Cl.,DB名)
入力装置から圧縮対象のデータを読み込むデータ読込部と、圧縮対象のデータを分割するブロック特定部と、分割されたブロックの文字列データを他のブロックの文字列と比較することで圧縮可能部分を探索する圧縮部分探索部を備え、
前記ブロック特定部は、圧縮対象の文字列の中から予め指定したバイト数の検索対象文字列を順次読み込むと共に、予め指定されたバイト数の指定文字列を取得し、これらを記憶する記憶部と、この記憶部に記憶されている検索対象文字列の中から前記指定文字列と同一の文字列を検索する検索部と、前記検索部による検索結果に従い圧縮対象の文字列をブロック化する分割処理部とを有し、
前記分割処理部は、
(1) 同一の文字列が発見された場合は、発見された文字列の直前までを1ブロックとする。
(2) 前記(1) において、発見された文字列部分で2文字連続して同じ文字が続く場合は、連続した2文字の間までを1ブロックとする。
(3) 同一の文字列が発見されなかった場合は、検索対象文字列の全体を1ブロックとする。
という条件で、しかも、前記(2) (1) (3) の優先順序に従って、圧縮対象の文字列をブロック化するものであり、
前記圧縮部分探索部は、前記分割処理部によって分割された各ブロック間の文字列を比較することで、冗長性除去による圧縮とランレングス圧縮を行うことを特徴とするデータ圧縮装置。
【発明の概要】
【発明が解決しようとする課題】
【0007】
前記の特許文献1や2のような辞書式やハフマン符号などの従来技術は、圧縮対象のデータの格納メモリとは別に、大きなメモリ容量や高い処理能力を有するCPUが必要である。そのため、メモリ容量や高い処理能力のCPUを持つことのできない組み込み型コンピュータシステムにおいては、従来のデータ圧縮技術を採用することは不可能であり、データ圧縮を行わずに通信を行ったり蓄積を行ったりしていた。このため、高効率の通信や、蓄積を行うことができなかった。
【0008】
特許文献3のように、対象となるデータをブロックに分割したランレングスによる圧縮は簡便ではあるが、圧縮効率が悪いという欠点があった。
【0009】
本発明は、上記のような従来技術の課題を解決するもので、その目的は辞書方式やハフマン符号方式、スライドウインドウを用いることなく、少ないメモリ容量と低い処理能力のCPUによっても、高い圧縮効率を実現することができるデータ圧縮方法及び装置を提供することにある。
【課題を解決するための手段】
【0010】
上記の目的を達成するために、本発明のデータ圧縮方法及び装置は、次のような特徴を有する。
(A)入力装置から圧縮対象のデータを読み込むデータ読込部と、圧縮対象のデータを分割するブロック特定部と、分割されたブロックの文字列データを他のブロックの文字列と比較することで圧縮可能部分を探索する圧縮部分探索部を備える。
(B)前記ブロック特定部は、圧縮対象の文字列の中から予め指定したバイト数の検索対象文字列を順次読み込むと共に、予め指定されたバイト数の指定文字列を取得し、これらを記憶する記憶部と、この記憶部に記憶されている検索対象文字列の中から前記指定文字列と同一の文字列を検索する検索部と、前記検索部による検索結果に従い圧縮対象の文字列をブロック化する分割処理部とを有する。
(C)前記分割処理部は、
(1) 同一の文字列が発見された場合は、発見された文字列の直前までを1ブロックとする。
(2) 前記(1) において、発見された文字列部分で2文字連続して同じ文字が続く場合は、連続した2文字の間までを1ブロックとする。
(3) 同一の文字列が発見されなかった場合は、検索対象文字列の全体を1ブロックとする。
という条件で、しかも、前記(2) (1) (3) の優先順序に従って、圧縮対象の文字列をブロック化する。
(D)前記圧縮部分探索部は、前記分割処理部によって分割された各ブロック間の文字列を比較することで、冗長性除去による圧縮とランレングス圧縮を行う。
【0011】
また、本発明のデータ圧縮方法は、次のような処理を順次行うことを特徴とする。
(A)圧縮対象の文字列の中から予め指定したバイト数の検索対象文字列を順次読み込む。
(B)前記検索対象文字列の中から、予め指定されたバイト数の指定文字列と同一の文字列を検索する。
(C)前記検索処理の結果、
(1) 同一の文字列が発見された場合は、発見された文字列の直前までを1ブロックとする。
(2) 前記(1) において、発見された文字列部分で2文字連続して同じ文字が続く場合は、連続した2文字の間までを1ブロックとする。
(3) 同一の文字列が発見されなかった場合は、検索対象文字列の全体を1ブロックとする。
という条件を、前記(2) (1) (3) の優先順序に従って適用することにより、圧縮対象の文字列をブロック化する。
(D)前記分割された各ブロック間の文字列を比較することで、冗長性除去による圧縮とランレングス圧縮を行う
【発明の効果】
【0012】
本発明によれば、圧縮対象の文字列をブロック化することで、各ブロックの内容に応じて、冗長性除去による圧縮とランレングス圧縮の2つの圧縮方法を採用することが可能になり、メモリの少ないまたは処理能力の低い組み込み型コンピュータシステムにおいても高い圧縮率を得ることができるデータ圧縮方法及び装置を提供することが可能となる。
【発明を実施するための形態】
【0014】
1.第1実施形態
以下、本発明の実施形態を、
図1及び
図2に従って説明する。
【0015】
[構成]
本実施形態のデータ圧縮装置は、データの圧縮処理を行う圧縮処理部1、対象のデータを入力する入力装置2、圧縮後のデータを出力する出力装置3、及びこれらを制御する制御部4とから構成されている。
【0016】
圧縮処理部1は、入力装置2から圧縮対象のデータを読み込むデータ読込部11、読み込んだ圧縮対象のデータや圧縮処理の過程で記憶すべき各種の情報を記憶する記憶部12を備えている。圧縮処理部1は、圧縮対象のデータを所定の条件に従って分割するブロック特定部13、分割されたブロックの文字列データを他のブロックの文字列と比較することで圧縮可能部分を探索する圧縮部分探索部14及び出力バッファ15を備えている。
【0017】
データ読込部11は、制御部4からの指示に基づいて、入力装置2から文字データを読み込むものである。本実施形態において、圧縮対象の文字データとしては、例えば、各種機器の設定値、計測値、制御コマンドなど、数字、アルファベットその他複数種類の文字が連続した文字列データが用いられる。記憶部12は、データ読込部11が読み込んだ文字列データを一時的に保存するものであって、入力バッファとして使用される。
【0018】
ブロック特定部13は、圧縮対象のデータを
図5に示すような下記の条件に従って、小さいブロックに分割する。
(1) 先頭の1バイトと同じ値(同じ文字)の位置の直前まで
(2) 2文字連続して同じ値(同じ文字)が続く場合、連続した2文字の間
(ただし、前記(1) と(2) の条件が重なる場合は、(2) を優先する)
(3) 前記(1) (2) の条件が満たされなかった場合は、予め決めておいた最大長を1ブロックとする。
【0019】
なお、本実施形態では、前記(3) の最大長を128バイトとしたが、この値に限定されることなく、圧縮対象のデータの種類やハードウェアリソースに応じて適宜設定することができる。
【0020】
このような処理を行うため、ブロック特定部13は、圧縮対象の文字列の中から予め指定したバイト数の検索対象文字列を順次読み込むと共に、予め指定されたバイト数の指定文字列を取得し、これらを記憶する記憶部131と、この記憶部131に記憶されている検索対象文字列の中から前記指定文字列と同一の文字列を検索する検索部132と、前記検索部132による検索結果に従い圧縮対象の文字列をブロック化する分割処理部133とを有する。すなわち、この分割処理部133が、前記(1) から(3) に示す処理に従い、圧縮対象の文字列をブロック化し、その結果を圧縮部分探索部14に出力する。
【0021】
前記圧縮部分探索部14は、記憶部12に記憶されている圧縮対象の文字列の中から、圧縮対象部分を探索するものである。この圧縮部分探索部14は、圧縮対象のデータを有するブロック(注目ブロックという)と、注目ブロックよりも前のブロックの文字列を比較して、同一の文字列の有無を探索する。
【0022】
その場合、圧縮部分探索部14は、
図6に示すような次の2つの処理を行う。
(a) 前のブロックの先頭の1バイトから注目ブロックの文字列を比較する処理(冗長性除去による圧縮)
(b) 前のブロックの最後の1バイトと注目ブロックの文字列を比較する処理(ランレングス圧縮)
【0023】
この場合、注目するブロックの前ブロック(前ブロックは複数あってよい)に対して、前ブロックの先頭及び最後のバイトのそれぞれと、注目するブロックの先頭からバイト単位のコンペアを行い一致する長さを最大65536バイトまで求める(65536という値は参考値である、ハードウエアリソースにより決める)。また、前ブロックに対して、n個前のブロックに対しても一致サイズを求めてもよい。
【0024】
圧縮部分探索部14は、これらの一致サイズのあらかじめ決めておいたサイズ以上の中から最長の一致サイズを持つものを採用し、これを冗長ブロックとして、そのブロックの識別子と、先頭または最後の1バイトから文字列が一致することを、圧縮データとして出力バッファ15に格納する。具体的には、圧縮部分探索部14は、前記(a) (b) の処理の結果得られた情報、例えば圧縮対象となったブロックの識別子、圧縮部分が発見されたブロックが注目ブロックの何個前であるか、先頭/最終バイト、一致したバイト数(文字列の数)などを出力バッファ15に書き出す機能を有する。
【0025】
出力バッファ15は、圧縮部分探索部14からの圧縮部分に関する情報を一時的に記憶し、予め設定されたタイミングで外部の出力装置3に出力するものである。この出力バッファ15は、ハードウェアとしては記憶部12の一部に設けられていても良いが、本実施形態では、圧縮対象のデータを保存したり圧縮処理の途中で得られた情報を記憶する処理と、出力データに関する処理を区別するために、出力バッファ15を独立して説明している。
【0026】
[作用]
前記の様な構成を有する本実施形態の作用を、
図2〜
図4に示すフローチャートにより説明する。
【0027】
(I)全体的な処理…
図2
図2は、データ圧縮方法の全体的な処理を示すものである。この
図2の処理は、記憶部12に読み込んだ全データについて、1ブロックの探索処理と最大冗長度の探索処理を交互に行うことで、全データを1つずつ順番にブロック化しながらその都度最大冗長度の探索を行うものである。
【0028】
なお、
図2では、まず最大冗長度の探索を行い、その結果に従ってブロック化を実施するというループが示されているが、最初の1ブロックのみをまずブロック化して、その後、最大冗長度の探索と2ブロック目以降のブロック化を実行する様なループを有するフローチャートでも、同一の結果を得ることができる。
【0029】
図2において、制御部4の指令に基づいて、圧縮処理部1のデータ読込部11が、入力装置2から圧縮対象のデータを受信すると、そのデータは記憶部12を構成するバッファ内に記憶される(ステップ21)。この場合、データ読込部11は、入力装置2からの全データを読み込んでも良いし、記憶部12に先読みバッファを設けて、そこに最大ブロック長以上を読み込んでおいても良い。
【0030】
次に、圧縮部分探索部14は、記憶部12に記憶されているデータの先頭の位置を注目点に設定し(ステップ22)、この注目点からデータを構成する文字列中の圧縮部分、すなわち、連長圧縮及び冗長圧縮の対象となる部分があるか否かを探索する(ステップ23)。この圧縮部分の探索は、制御部4が、圧縮処理部1に設けられた圧縮部分探索部14を呼び出して、
図4のフローチャートに示す処理を実行することにより行われる。なお、この圧縮部分探索の詳細は、後述する。
【0031】
なお、読み込んだ全データの先頭位置(先頭バイト)を注目点とした最初の圧縮部分の探索処理は、データがブロック化されていないため、ステップ23において圧縮部分を発見することはできない。この最初の探索処理やその後作成したブロックに対して探索処理を実施した結果、圧縮部分が発見されなかった場合は(ステップ24のNO)、
図3のフローチャートに示す1ブロックの探索処理を呼び出して、次の1ブロックの特定処理を行う(ステップ25)。なお、この1ブロックの特定処理の詳細は、後述する。
【0032】
ステップ25において、1ブロックの特定が行われた後は、見つけた1ブロックを無圧縮のブロックとして、その識別子とサイズ及びデータ部分を出力バッファ15に書き出す(ステップ26)。同時に、見つけた1ブロックの先頭の位置と長さを、次のループの圧縮部分探索のために記憶部12に記憶する(ステップ27)。
【0033】
その後、出力バッファ15のデータを出力装置3に書き出し(ステップ28)、全データについてそのブロック化と圧縮部分の探索が終わったかを確認する(ステップ29)。そして、すべてのデータについてブロック化と圧縮部分の探索が終わった場合には、データ圧縮処理を終了する(ステップ29のYES)。ブロック化と圧縮部分の探索するデータが残っている場合には、ステップ23に戻って圧縮部分の探索処理を行う(ステップ29のNO)。
【0034】
一方、前記ステップ23において、圧縮部分の探索を行った結果、圧縮部分が発見された場合には(ステップ24のYES)、出力バッファ15に次の情報を書き込む(ステップ30)。
(1) 圧縮部分のブロックの識別子
(2) ブロックの先頭のバイトから圧縮部分を探索した冗長圧縮であるか、ブロックの最後のバイトから圧縮部分を探索した連長圧縮であるかの区別
(3) 圧縮の長さ
【0035】
次いで、圧縮部分として処理した長さを1ブロックとして、そのブロックの先頭の位置と、ブロックの長さを記憶部12に記憶する(ステップ31)。この記憶した情報により、圧縮部分がなかったと判断して1ブロックの探索処理を行ったステップ25の場合と同様に、そのループにおける1ブロックの特定が可能となる。
【0036】
その後、ステップ30で出力バッファ15に書き込んだ(1) 〜(3) の情報を、出力バッファ15から外部の出力装置3に書き出すことで、このループの処理を終了する。以下、ステップ29において、すべてのループの処理が終わったか否かを確認して、全部のデータについて処理が終了した場合には、読込部11によって読み込んだデータに対する圧縮処理を終了する。
【0037】
(II)1ブロックの探索処理…
図3
前記
図2に示した全体処理のステップ25で呼び出される1ブロックの探索処理について、
図3に従って説明する。制御部4により、1ブロックの探索処理が呼び出されると、ブロック特定部13が、記憶部12に読み込まれている全データの中から、予め定めた1ブロックの最大長分のデータ(本実施形態では128バイト)を読み込む(ステップ31)。
【0038】
次いで、ブロック特定部13が、記憶部12に記憶されているデータの先頭を注目点とし、その位置の値をc1に設定する。この注目点の位置の値=c1は、先頭と同じ文字を有するバイトを見つけるためのものである(ステップ32)。この状態で、設定された注目点の位置の値を示す変数cprvにc1を、ブロック長を示す変数nlenに1を代入する(cprv=c1:nlen=1:ステップ33)。
【0039】
前記のようにして注目点が設定された後、ブロック特定部13は、注目点を1バイト進め、進んだ後の注目点の位置の値を変数ccurに代入する(ステップ34)。次いで、1バイト進んだ注目点の位置の値ccurと、1バイト進む前の設定された注目点の位置の値cprvとを比較し、両者の値が等しい場合(ccur=cprv)には(ステップ35のYES)、連続する2バイトを見付けたので、2文字連続して同じデータが続くとして、そこをブロックの切れ目とする(ステップ36)。そして、ブロック長をその時点のnlenとする。この処理は、
図5に示す1ブロックの探索処理を説明するデータ構造図中の(2)に相当する。
【0040】
一方、1バイト進んだ注目点の位置の値ccurと、1バイト進む前の設定された注目点の位置の値cprvが異なる場合(ccur≠cprv)には(ステップ35のNO)、最初の注目点の位置の値c1と1バイト進んだ注目点の位置の値ccurとを比較する(ステップ37)。両者の値が等しい場合は(ccur=c1:ステップ37のYES)、1バイト進んだ注目点の次の位置の値cnxtを読み込み、これを1バイト進んだ注目点の位置の値ccurと比較する(ステップ38)。
【0041】
両者が等しい場合、すなわちccur=cnxtの場合には(ステップ38のYES)、連続する2バイトを見付けたので、そこをブロックの切れ目とし、ブロック長をnlen+1とする(ステップ39)。この処理は
図5に示すデータ構造図中の(3)に相当する。
【0042】
両者が異なる場合、すなわちccur≠cnxtの場合には(ステップ38のNO)、先頭の1バイト目と同じバイトを見付けたので、そこをブロックの切れ目とし、ブロック長をnlenとする(ステップ40)。この処理は
図5に示すデータ構造図中の1に相当する。このようにすることで、
図5において、(1)と(2)の条件が重なる場合に、(2)を優先することができる。
【0043】
前記ステップ37において、最初の注目点の位置の値c1と1バイト進んだ注目点の位置の値ccurが異なる場合は(ccur≠c1:ステップ37のNO)、ブロック長をnlen=nlen+1とし(ステップ41)、すべてのバイトに対する処理が終了しているか否かを判定する(ステップ42)。処理が終了していない場合には(ステップ42のNO)、再びステップ34に戻り、注目点を1バイト進めてデータの最後のバイトまで前記の処理を繰り返す。
【0044】
一方、処理が終了した場合には(ステップ42のYES)、記憶部12に読み込んだデータ中には、
図5の(1)〜(3)の条件を満たす文字列が見つからなかったとして、全データを1ブロックとする。すなわち、
図5の(4)に示すように、予め決めておいた最大長を1ブロックとする。
【0045】
このようにして、本実施形態では、ブロック特定部13によって全データが1つあるいは複数のブロックに分割されるので、この処理が終了した後は、制御部4は、
図2に示す全体処理のステップ26に戻って圧縮処理を続行する。
【0046】
(III)圧縮部分の探索
図2に示した全体処理のステップ23で呼び出される圧縮部分の探索処理について、
図4のフローチャートに従って説明する。
【0047】
本実施形態において、
図5に示すような条件でデータのブロック分けを行った場合に、ブロック間には以下のような特徴を持つ。
(a) 隣り合うブロックの先頭の1バイトが同じ値になることが多い。
(b) 前のブロックの最後の1バイトが、先頭のブロックの先頭の1バイトと同じ値になることが多い。そこで、本実施形態では、前記(a)の特徴に着目して、冗長圧縮を行い、(b)の特徴に着目して連長圧縮を行う。
【0048】
冗長圧縮に関しては、圧縮部分探索部14により、記憶部12に記録されているブロック化されたデータについて、最終のブロックを注目ブロックに設定し、その注目ブロックの先頭のバイトを注目点に設定する(ステップ41)。同時に、探索開始時の処理として、最大冗長度を示す長さデータの値をクリアする。
【0049】
次に、注目点ブロックの1つ前のブロックに対して、注目点と1つ前のブロックの先頭のバイトからのデータの比較を行い、一致するデータの長さを求める(ステップ42)。この処理は、
図6に示すデータ構造図中の(1)の処理に相当する。
【0050】
比較の結果、データの長さが今までのブロックで一致したデータの長さよりも長い場合(ステップ43のYES)は、そのブロックが注目ブロックの何個前のブロックであるか、及び今までより長い一致したデータの長さを記憶部12に記憶する(ステップ44)。
【0051】
なお、注目ブロックの1つ前のブロックの場合には、ステップ41で長さデータをクリアしているので、1つ前のブロックで一致した長さが一番長くなる。
【0052】
このようにして、冗長圧縮の処理を行った後は、連長圧縮処理として、注目ブロックの最初のバイト(注目点)を開始点として、1つ前のブロックの最後のバイトと注目ブロックの各バイトとの比較を行い、一致する長さを求める(ステップ45)。この処理は、
図6に示すデータ構造図中の(2)の処理に相当する。
【0053】
求めた長さが今までよりも長い場合には(ステップ46のYES)、そのブロックが注目ブロックの何個前のブロックであるか、及び今までより長い一致したデータの長さを記憶部12に記憶する(ステップ47)。
【0054】
その後、探索対象のブロックを1つさかのぼる(ステップ48)。そして、ループを繰り返す場合には(ステップ49のNO)、ステップ42に戻って、前記の処理を繰り返す。
【0055】
一方、さかのぼるブロックが存在しないか、予め指定しておいた回数分ブロックをさかのぼった場合は(ステップ49のYES)、ループを終了して、コール元である
図2の圧縮処理のフローチャートのステップ23に対して、一致した長さが最大のブロックの位置と、一致サイズを格納して、最大冗長度の探索処理を終了する。
【0056】
この圧縮部分の探索処理において、ランレングス圧縮、冗長性探索のどちらも有効な圧縮ができなかった場合(すべてのループにおいて、ステップ43及びステップ46がNO)には、圧縮できないブロックとして、識別子のデータを格納する。しかし、前ブロックの先頭バイトを同じバイトを持つブロックの場合には、それを示す識別子をおき、先頭バイトを格納しない。このことにより、ブロックのデータ長が十分小さい場合には、識別子分のデータを増やしてしまうことなくブロック情報で圧縮データの中に格納できる。
【0057】
また、上記のどの方法にも当てはまらない場合には、識別子1バイト以上と圧縮していないデータを格納する。
【0058】
このような処理を行う本実施形態では、注目ブロックの先頭バイトからの文字列と直前のブロックの最終バイトとの比較結果である連長圧縮が、ランレングス圧縮と同じ結果を生むことから、この方法により、ランレングス圧縮と、冗長性除去による圧縮の2つの圧縮方式の両方を実施できる。
【0059】
また、全データ探索を行っていないためスライディングウインドウを用いた冗長性の探索よりは、探索の精度が落ちるが、大量のデータコンペアを行う必要が無いため、処理能力に制限のあるCPUやメモリ容量が少ない機器においても、早い探索が可能である。
【0060】
特に、本実施の形態において、ステップ42及びステップ45における文字列の比較処理は、ブロックを越えて予め定めた最大バイト(例えば65536バイト)まで実施することができる。そのようにすれば、同じバイトが連続する場合最大サイズのデータを数バイトにまで圧縮できる。なお、この最大バイトは、ハードウェアのリソースなどにより適宜設定することができる。
【0061】
2.第2実施形態
第2実施形態は、第1実施形態における1ブロックの探索処理を、別の条件で行うものである。すなわち、第1実施形態は1ブロックの探索処理を1バイトのデータを注目点として、同一のデータが存在しないか、あるいは同じ値のデータ(文字)が連続していないかを基準としてブロックを特定した。これに対して、第2実施形態は、複数バイト(複数文字)を注目点として探索を行い、ブロックを特定する。
【0062】
具体的には、
図8に示すように、次の処理を行う。
(1) 予め設定した指定バイト分(例えば128バイト)の文字列を検索対象として、128バイトの文字列中に予め定めた複数バイトの文字列、
図8では3バイト(A,B,C)の文字列と同じパターンの文字列(A,B,C)が見つかるまで探索を行う。そして、予め定めた3バイトの文字列が(A,B,C)のように異なる文字で構成されている場合には、見つかった同じ文字列の前のバイトまでを1ブロックとする。
(2) 前記(1) と同様にして検索を行い、予め定めた3バイトの文字列が(A,A,A)のように同一の文字で構成されている場合には、見つかった同じ文字列の1番目と2番目の文字列の間までを1ブロックとする。
(3) 予め設定した指定バイト(例えば128バイト)中に、指定した3バイト分の文字列と同一の文字列が発見されなかった場合には、指定バイト(例えば128バイト)を1ブロックとする。
【0063】
以下、本実施形態の処理を
図7のフローチャート及び
図9及び
図10のデータ構成図に従って説明する。
まず、ユーザが予め決めておいた注目点として探索を行う文字数(複数バイト)をcmax:=指定文字列のバイト数として、予め記憶部12に記憶させておく。本実施形態では、この文字数を3バイト(cmax:=)とする。この状態で、記憶部12のバッファに1ブロックの最大長分の文字列(例えば65536バイト)を読み込む(ステップ71)。
【0064】
次に、初期値として、注目点p1をバッファの先頭(読み込んだ文字列の先頭)とし、探索開始場所を保持するための変数cpにバッファ先頭のバイトの位置を代入した後、注目点を1バイト進める(ステップ72)。そして、ブロック長nlenに1を代入する(ステップ73)。
【0065】
次に、バッファ先頭cpから3バイト分の文字列と、バッファ先頭から1つ進んだ注目点p2から3バイト分の文字列を比較する(ステップ74)。
図9の例では、バッファ先頭cpからの3バイト分の文字列が(A,B,C)であり、バッファ先頭から1つ進んだ注目点p2から3バイト分の文字列が(B,C,D)であるから、ステップ74の比較結果(ステップ75)はNOである。
【0066】
比較の結果、3バイト分の文字列が異なる場合には、注目点を次のバイトに移動すると共に、nlen=nlen+1としてブロック長を1つ加算する(ステップ76)。この場合、
図9の(3)に示すように、3バイト目を新たな注目点p3とする。その後、すべてのバイト(128バイト)に対する処理が終わったか否かの確認を行い(ステップ77)、
図9の(3)のように、処理すべきバイトが残っている場合には、ステップ74に戻って次のバッファ先頭cpからの3バイト分の文字列(A,B,C)と、新たな注目点p3からの3バイト分の文字列(C,D,E)との比較を行う。
【0067】
以下同様にして、注目点を進めるごとに3バイト分の文字列の比較を行い、n番目の注目点で3バイト分の文字列(A,B,C)が一致した場合(ステップ75のYES)は、フローチャート中のこのループから抜け出して、同一とされた3バイト分の文字列がすべて同じバイト(同じ文字)で構成されているかをチェックする(ステップ78)。
【0068】
図9では、3バイト分の文字列は(A,B,C)であり、異なるバイトから構成されているから(ステップ79のNO)、
図9の(4)のように、注目点の位置を次のブロックの先頭とし、ブロック長をその時点でのnlenとして、1ブロックの分割処理を終了する(ステップ80)。
【0069】
一方、
図10は、3バイト分の文字列が同一の文字列(A,A,A)から構成されている場合のデータ構造図であって、
図7のフローチャートにおいて、3バイト分の文字列がすべて同じ文字で構成されているかを検査する処理(ステップ78)までは、
図9の実施形態と同一である。
【0070】
図10の実施形態では、3バイト分の文字列が同一の文字列(A,A,A)から構成されているので(ステップ79のYES)、
図10の(4)に示すように、注目点pn+1の位置を次のブロックの先頭とし、ブロック長nlen=nlen+1として、1ブロックの分割処理を終了する(ステップ81)。
【0071】
一方、
図7のフローチャートのループにおいて、予め指定した1ブロックの最大長のバイト(128バイト)まで、バッファ先頭からの3バイト分の文字列と、順次ずらしていったすべての注目点からの3バイト分との文字列を比較しても、同一の文字列が発見できなかった場合は(ステップ77のYES)、予め指定した最大長のバイト数を1ブロックの長さ(ブロック長=探索最大長)とする(ステップ82)。
【0072】
このようにして、第2実施形態においても、
(a) 隣り合うブロックの先頭の1バイトが同じ値になることが多い。
(b) 前のブロックの最後の1バイトが、先頭のブロックの先頭の1バイトと同じ値になることが多い。
という特徴を有するブロックに分割することができる。その結果、第2実施形態においても、前記(a)の特徴に着目して、冗長圧縮を行い、(b)の特徴に着目して連長圧縮を行うことが可能になる。
【0073】
3.他の実施形態
本発明は、前記の実施形態に限定されるものではなく、下記のような他の実施形態も包含する。
【0074】
(1)図示の実施形態は、記憶部12に読み込んだ全データについて、1ブロックの探索処理と、最大冗長度の探索処理とを交互に行うことで、全データを1つずつブロック化しながら最大冗長度の探索を行ったものである。しかし、本発明は、この実施形態に限定されるものではなく、予め全データを複数のブロックに分割してから最大冗長度の探索処理を行うことも可能である。
【0075】
(2)本発明の請求項において、予め指定するバイト数の文字列とは、第2実施形態のような複数の文字列に限らず、第1実施形態のような1バイト分の文字も包含する。
【0076】
(3)本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。