(58)【調査した分野】(Int.Cl.,DB名)
出現可能な前記第1連続数を値が小さい順に複数の第1グループに分割し、出現可能な前記第1連続数の各々に、前記第1グループ毎にビット数が異なるコード値であって、値が小さい前記第1連続数を含む前記第1グループほどビット数が少ない第1コード値を割り当て、前記第1連続数の代わりに前記第1コード値を配置して前記圧縮データを生成する場合に、前記圧縮データのサイズが最も小さくなる前記第1グループの第1分割数と、前記第1グループの各々に割り当てる第1コード値のビット数との組み合わせを探索し、
探索により得られた前記第1分割数と、前記第1グループ毎の前記第1コード値のビット数を得るための第1ビット数情報とを含むヘッダを、前記圧縮データが配置されるボディの前に配置し、
前記第1連続数の代わりに前記ボディに前記第1コード値を配置すること
を特徴する請求項1に記載のデータ圧縮方法。
出現可能な前記第2連続数を値が小さい順に複数の第2グループに分割し、出現可能な前記第2連続数の各々に、前記第2グループ毎にビット数が異なるコード値であって、値が小さい前記第2連続数を含む前記第2グループほどビット数が少ない第2コード値を割り当て、前記第2連続数の代わりに前記第2コード値を配置して前記圧縮データを生成する場合に、前記圧縮データのサイズが最も小さくなる前記第2グループの第2分割数と、前記第2グループの各々に割り当てる第2コード値のビット数との組み合わせを探索し、
探索により得られた前記第2分割数と、前記第2グループ毎の前記第2コード値のビット数を得るための第2ビット数情報とを含むヘッダを、前記圧縮データが配置されるボディの前に配置し、
前記第2連続数の代わりに前記ボディに前記第2コード値を配置すること
を特徴する請求項5に記載のデータ圧縮方法。
所定値である第1データと前記所定値以外の第2データとが繰り返し連続するデータ列に基づいて、前記データ列の先頭から、連続する前記第1データの数である第1連続数と、連続する前記第2データの数である第2連続数と、前記第2連続数分の前記第2データとが繰り返し配置された圧縮データを伸長するデータ伸長方法であって、
前記圧縮データを入力し、
前記第1連続数が示す数の前記第1データを復元し、前記圧縮データ中の前記第2連続数分の前記第2データを前記圧縮データから取り出す処理を繰り返すことで、前記データ列を復元すること
を特徴とするデータ伸長方法。
前記ヘッダに含まれる、出現可能な前記第1連続数の各々について、前記データ列に含まれる前記第1データの前記第1連続数として存在するか否かを示す存在情報を入力し、
前記存在情報に基づいて、存在する前記第1連続数に通し番号を割り当て、
前記ボディに含まれる前記通し番号に基づいて、前記第1連続数を抽出すること
を特徴する請求項13または請求項14に記載のデータ伸長方法。
前記圧縮データが配置されるボディの前に配置されるヘッダに含まれる、出現可能な前記第1連続数を値が小さい順に分割した複数の第1グループの第1分割数と、出現可能な前記第1連続数の各々に割り当てられた、前記第1グループ毎にビット数が異なるコード値であって、値が小さい前記第1連続数を含む前記第1グループほどビット数が少ない第1コード値のビット数を得るための第1ビット数情報とを入力し、
前記第1分割数と前記第1ビット数情報とを使用して、前記ボディに含まれる前記第1コード値から前記第1連続数を抽出すること
を特徴する請求項12に記載のデータ伸長方法。
前記ヘッダに含まれる、出現可能な前記第2連続数を値が小さい順に分割した複数の第2グループの第2分割数と、出現可能な前記第2連続数の各々に割り当てられた、前記第2グループ毎にビット数が異なるコード値であって、値が小さい前記第2連続数を含む前記第2グループほどビット数が少ない第2コード値のビット数を得るための第2ビット数情報とを入力し、
前記第2分割数と前記第2ビット数情報とを使用して、前記ボディに含まれる前記第2コード値から前記第2連続数を抽出すること
を特徴する請求項16に記載のデータ伸長方法。
所定値である第1データと前記所定値以外の第2データとが繰り返し連続するデータ列に基づいて、前記データ列の先頭から、連続する前記第1データの数である第1連続数と、連続する前記第2データの数である第2連続数と、前記第2連続数分の前記第2データとが繰り返し配置された圧縮データを伸長するデータ伸長装置であって、
前記圧縮データを入力する入力部と、
前記第1連続数が示す数の前記第1データを復元し、前記圧縮データ中の前記第2連続数分の前記第2データを前記圧縮データから取り出す処理を繰り返すことで、前記データ列を復元する伸長処理部と、
を有することを特徴とするデータ伸長装置。
所定値である第1データと前記所定値以外の第2データとが繰り返し連続するデータ列に基づいて、前記データ列の先頭から、連続する前記第1データの数である第1連続数と、連続する前記第2データの数である第2連続数と、前記第2連続数分の前記第2データとが繰り返し配置された圧縮データを伸長するデータ伸長プログラムであって、
前記圧縮データを入力し、
前記第1連続数が示す数の前記第1データを復元し、前記圧縮データ中の前記第2連続数分の前記第2データを前記圧縮データから取り出す処理を繰り返すことで、前記データ列を復元する処理を
コンピュータに実行させることを特徴とするデータ伸長プログラム。
【発明を実施するための形態】
【0011】
以下、図面を参照して実施の形態の説明を行う。なお、各図面において、同一構成部分には同一符号を付し、重複した説明を省略する場合がある。
【0012】
(第1の実施形態)
図1は、本発明の第1の実施形態におけるデータ配信システムの一例を示すブロック図である。
図1に示すデータ配信システムSYSは、ネットワークNWを介して相互に接続されたデータ配信装置100と少なくとも1つの機器200とを有する。
図1に示す例では、多数の機器200がネットワークNWに接続されている。データ配信装置100とネットワークNWとの接続、および各機器200とネットワークNWとの接続は、有線でもよく無線でもよい。
【0013】
例えば、データ配信装置100は、汎用サーバまたはパーソナルコンピュータ等の情報処理装置であり、ネットワークNWを介して各機器200にファームウェアの更新データを配信する機能を有する。この際、データ配信装置100は、旧ファームウェアと新ファームウェアの差分データをデータ列として抽出し、抽出したデータ列を圧縮して各機器200に配信する。例えば、各機器200は、工場、プラント、または一般家庭等に設置されるスマートメータ(電力量計)等の情報端末である。なお、各機器200は、スマートフォン、デジタル家電、カーナビゲーション端末等でもよい。
【0014】
図2は、
図1のデータ配信装置100のハードウェア構成の一例を示すブロック図である。データ配信装置100は、システムバスSBUSを介して相互に接続されたプロセッサ102、ROM(Read Only Memory)104、RAM(Random Access Memory)106および補助記憶装置108を有する。また、データ配信装置100は、入力装置110、表示装置112、外部インタフェース部114および通信インタフェース部116を有する。プロセッサ102は、コンピュータの一例である。
【0015】
プロセッサ102は、CPU(Central Processing Unit)等の演算処理装置であり、データ配信装置100の全体の動作を制御するとともに、各機器200に配信するファームウェアの更新データ(圧縮データ)を生成する。例えば、プロセッサ102は、ROM104または補助記憶装置108からRAM106に展開された制御プログラムおよびデータ圧縮プログラムを実行することで動作する。
【0016】
プロセッサ102は、制御プログラムを実行することで、データ配信装置100の全体の動作を制御し、データ圧縮プログラムを実行することで、各機器200に配信するファームウェアの更新データを生成する。なお、ファームウェアの更新データの生成は、プロセッサ102に搭載されるFPGA(Field-Programmable Gate Array)等のプログラマブルロジックにより実行されてもよい。あるいは、ファームウェアの更新データの生成は、システムバスSBUSに接続されたFPGA等のプログラマブルロジックにより実行されてもよい。
【0017】
ROM104には、プロセッサ102が実行する各種プログラムだけでなく、データ配信装置100で使用する各種パラメータが記憶されてもよい。RAM106には、データ配信装置100で使用するワークデータが記憶されてもよい。補助記憶装置108は、例えば、HDD(Hard Disk Drive)またはSSD(Solid State Drive)等である。
【0018】
入力装置110は、例えば、キーボード、マウスまたはタッチパネル等の少なくともいずれかである。表示装置112は、例えば、液晶ディスプレイ等である。外部インタフェース部114は、図示しない入出力ポートに接続された記録媒体150等の外部装置に対してデータを読み書きする機能を有する。特に限定されないが、記録媒体150は、例えば、フレキシブルディスク、CD(Compact Disc)、DVD(Digital Versatile Disk)、SDメモリカード(Secure Digital memory card)、USB(Universal Serial Bus)メモリ等である。
【0019】
通信インタフェース部116は、ネットワークNWに接続され、データ配信装置100から
図1に示した各機器200にファームウェアの更新データを送信する機能を有する。なお、データ配信装置100は、プリンタ等の出力装置、または、プリンタに接続される出力インタフェースを有してもよい。
図2に示すデータ配信装置100のハードウェア構成は一例であって、
図2の構成に限定されない。
【0020】
図3は、
図1のデータ配信装置100の機能構成の一例を示すブロック図である。データ配信装置100は、差分データ生成部122、圧縮処理部124および通信部126を有する。
図3に示す各機能部は、ハードウェアで実現されてもよく、ソフトウェア(データ圧縮プログラム)の実行により実現されてもよい。
【0021】
差分データ生成部122は、旧ファームウェアFW0と新ファームウェアFW1とのバイナリデータを比較することで、旧ファームウェアFW0と新ファームウェアFW1との差分を示す差分データ列を作成する。例えば、旧ファームウェアFW0と新ファームウェアFW1とは、
図2のRAM106または補助記憶装置108に格納されている。
【0022】
圧縮処理部124は、図示しない入力部で差分データ列を入力し、入力した差分データ列を圧縮することで、圧縮データを生成する。圧縮処理部124は、データ圧縮装置の一例である。通信部126は、
図2の通信インタフェース部116に対応しており、ネットワークNWを介して、ファームウェアの更新が必要な機器200に圧縮データを送信する。
【0023】
図4は、
図1の機器200のハードウェア構成の一例を示すブロック図である。機器200は、バスBUSを介して相互に接続されたMCU202、ROM204、RAM206、フラッシュメモリ208、入力インタフェース部210、入出力インタフェース部212および通信インタフェース部214を有する。MCU202は、コンピュータの一例である。
【0024】
MCU202は、CPUコアと各種周辺機能を有し、ファームウェアを実行することで機器200の全体の動作を制御する。また、MCU202は、データ配信装置100から受信したファームウェアの更新データに基づいて、ファームウェアを更新する機能を有する。例えば、ファームウェアの更新は、MCU202の起動時に、ファームウェアの実行を開始する前にMCU202により実行される基本プログラム中のデータ伸長プログラムにより実施される。
【0025】
例えば、MCU202は、ROM204に格納された基本プログラムと、フラッシュメモリ208に格納されたファームウェアを実行することで動作する。MCU202は、データ伸長プログラムを実行することで、データ配信装置100から受信した圧縮データ(ファームウェアの差分データ列)を使用して、フラッシュメモリ208に記憶されているファームウェアを更新する。
【0026】
ROM204には、MCU202が実行する基本プログラムだけでなく、機器200で使用する各種パラメータが記憶されてもよい。RAM206には、機器200で使用するワークデータが記憶されてもよい。
【0027】
入力インタフェース部210は、例えば、電力量を示す電力情報を受信し、受信した電力情報をMCU202に出力する。なお、電力量を示すアナログ信号が、入力インタフェース部210を介さずに、MCU202のアナログ入力端子に供給され、MCU202に搭載されるADC(Analog-to-Digital Converter)によりデジタル信号に変換されてもよい。
【0028】
入出力インタフェース部212は、工場、プラント、または一般家庭等に設置済みの機器200に対して各種情報を直接入出力する場合に使用される。通信インタフェース部214は、ネットワークNWに接続され、データ配信装置100からファームウェアの更新データ等を受信する機能を有する。例えば、ファームウェアの更新データは、更新前のファームウェアと更新後のファームウェアとの差分データ列が圧縮された圧縮データである。通信インタフェース部214が受信したファームウェアの更新データは、RAM206またはフラッシュメモリ208に格納されてもよく、MCU202により取得されてもよい。なお、
図4に示す機器200のハードウェア構成は一例であって、
図4の構成に限定されない。
【0029】
図5は、
図1の機器200の機能構成の一例を示すブロック図である。機器200は、通信部222、伸長処理部224および更新処理部226を有する。
図5に示す各機能部は、ハードウェアで実現されてもよく、ソフトウェア(データ圧縮プログラム)の実行により実現されてもよい。
【0030】
通信部222は、
図4の通信インタフェース部214に対応しており、ネットワークNWを介してデータ配信装置100から受信する圧縮データ(ファームウェアとの差分データ列)を入力する入力部の機能を有する。通信部222は、入力した圧縮データを伸長処理部224に出力する。
【0031】
伸長処理部224は、通信部222から受信した圧縮データを伸長して、圧縮前の差分データ列を生成する。伸長処理部224は、生成した差分データ列を更新処理部226に出力する。伸長処理部224は、データ伸長装置の一例である。
【0032】
更新処理部226は、伸長処理部224から受信した差分データ列に基づいて、
図4のフラッシュメモリ208に記憶されているファームウェア(旧ファームウェア)を更新し、新ファームウェアとしてフラッシュメモリ208に格納する。なお、新ファームウェアは、
図4のRAM206に格納された後、フラッシュメモリ208に格納されてもよい。
【0033】
図6は、
図1のデータ配信システムSYSにおけるデータ配信装置100による圧縮処理と機器200による伸長処理との一例を示す説明図である。
図6に示す2桁の数値は、16進数で表記されている。また、図中の符号"h"は、数値が16進数であることを示す。
図6では、説明を分かりやすくするために、ファームウェアの更新データのうち、64バイトの差分データ列を圧縮および伸長する例を示し、1バイトの0値の連続数は、最大で255個であるとする。例えば、
図3の差分データ生成部122は、bsdiff等のバイナリ差分アルゴリズムを使用することで差分データ列を生成する。
【0034】
図6に示す64バイトの差分データ列のうち、点線の矩形枠で示すバイトデータは、差分データが"00h"でない非0値を示す。非0値は、更新前の旧ファームウェアと更新後の新ファームウェアとが互いに相違するバイトデータを示す(更新あり)。点線の破線枠以外のバイトデータは、差分データが"00h"である0値を示す。0値は、更新前の旧ファームウェアと更新後の新ファームウェアとが互いに同じバイトデータであることを示す(更新なし)。0値は、所定値である第1データの一例であり、非0値は、所定値以外の第2データの一例である。本実施形態および以降の実施形態において、0値の連続数は、第1連続数の一例であり、非0値の連続数は、第2連続数の一例である。
【0035】
図6に示すように、一般にファームウェアの更新データは、旧ファームウェアに対する新ファームウェアの変更箇所が少なく、差分データ列は、0値のバイト数が非0値のバイト数に比べて多い。そこで、
図3の圧縮処理部124は、差分データ生成部122が生成した差分データ列を、0値が連続する塊と非0値が連続する塊とで区切り、塊毎に圧縮する。
【0036】
まず、圧縮処理部124は、差分データ列において、20バイト(14hバイト)の0値が連続するため、圧縮データとして"14h"を生成する。差分データが0値であるか非0値であるかに応じて圧縮データを生成することで、0値については、圧縮データ中に0値の連続数のみを配置すればよく、0値であることを示す情報を不要にすることができる。
【0037】
次に、圧縮処理部124は、差分データ列において、値が14hである1バイトの非0値があるため、圧縮データとして、破線枠で示すように"01h 14h"を生成する。"01h"は、非0値の連続数が1個(1バイト)であることを示し、"14h"は、1バイトの非0値自体を示す。次に、圧縮処理部124は、差分データ列において、26バイト(1Ahバイト)の0値が連続するため、圧縮データとして"1Ah"を生成する。
【0038】
次に、圧縮処理部124は、差分データ列において、値がFFhと03hである2バイトの非0値があるため、圧縮データとして、破線枠で示すように"02h FFh 03h"を生成する。"02h"は、非0値の連続数が2個(2バイト)であることを示し、"FFh"および"03h"は、それぞれ1バイトの非0値自体を示す。次に、圧縮処理部124は、差分データ列において、15バイト(0Fhバイト)の0値が連続するため、圧縮データとして"0Fh"を生成する。
【0039】
以上の圧縮処理により、64バイトの差分データ列を8バイトに圧縮することができ、圧縮率は、"0.125"になる。これに対して、一般のランレングス符号では、"値"と"値の連続数"のペアが順次生成される。このため、生成された圧縮データは、0値であることを示す"00h"を含む。また、生成された値が互いに異なる非0値が連続する場合("FFh"と"03h")、各非0値の連続数である"01h"が生成された圧縮データに含まれる。この結果、一般のランレングス符号を使用した圧縮では、64バイトの差分データ列を12バイトにしか圧縮することができず、圧縮率は、"0.1875"になる。
【0040】
すなわち、
図6に示す例では、圧縮データを一般のランレングス符号で圧縮した場合の圧縮データの約67%に削減することができ、圧縮効率を向上させることができる。この結果、機器200のファームウェアの更新データをデータ配信装置100から各機器200に配信する場合に必要なネットワークNWのトラフィック量を、ランレングス符号で圧縮する場合に比べて約3分の2に削減することができる。
【0041】
圧縮データの伸長は、圧縮と逆の手順で実行される。例えば、0値の連続数が示す数の0値を復元し、圧縮データ中の非0値の連続数分の非0値を圧縮データから取り出す処理を繰り返すことで、圧縮前のデータ列である差分データ列を復元することができる。伸長処理では、ランレングス符号と同様に、圧縮データを順次読み出しながら圧縮データを伸長することができる。このため、MCU202が伸長時に使用するワークメモリの使用量を抑えることができる。
【0042】
図7は、
図3のデータ配信装置100の圧縮処理部124による圧縮処理の一例を示すフロー図である。すなわち、
図7は、データ配信装置100により実行されるデータ圧縮方法の一例を示す。例えば、
図7に示す処理は、データ配信装置100のプロセッサ102が、データ圧縮プログラムを実行することで実現される。
【0043】
まず、ステップS100において、プロセッサ102は、ファームウェアの更新データ(差分データ)であるデータ列を差分データ生成部122から入力する。次に、ステップS102において、プロセッサ102は、データ列における0値の連続数をカウントする。次に、ステップS104において、プロセッサ102は、ステップS102でカウントした0値の連続数を1バイトの圧縮データとして出力する。なお、ステップS102で0値の連続数が0個であった場合、すなわち、データ列の先頭が非0値であった場合、プロセッサ102は、0値の連続数"00h"を出力する。
【0044】
次に、ステップS106において、プロセッサ102は、データ列が終了した場合、
図7に示す処理を終了し、圧縮していないデータ列がある場合、ステップS108を実行する。ステップS108において、プロセッサ102は、データ列における1バイトの非0値の連続数をカウントする。次に、ステップS110において、プロセッサ102は、ステップS108でカウントした非0値の連続数を圧縮データとして出力する。次に、ステップS112において、プロセッサ102は、ステップS108でカウントした連続数分の非0値を順次出力する。次に、ステップS114において、プロセッサ102は、データ列が終了した場合、
図7に示す処理を終了し、圧縮していないデータ列がある場合、ステップS102を実行する。
【0045】
図8は、
図5の機器200の伸長処理部224による伸長処理の一例を示す説明図である。すなわち、
図8は、機器200により実行されるデータ伸長方法の一例を示す。例えば、
図8に示す処理は、データ配信装置100のMCU202が、データ伸長プログラムを実行することで実現される。
【0046】
まず、ステップS200において、MCU202は、ネットワークNWを介してデータ配信装置100からファームウェアの更新データ(差分データ)である圧縮データ(データ列)を受信(入力)する。例えば、MCU202は、ステップS202からステップS210の処理を、データ列を受信しながら実行する。しかしながら、RAM206等の記憶装置のメモリ容量に余裕がある場合、MCU202は、ファームウェアの全ての更新データをステップS200で受信した後、ステップS202以降の処理を実行してもよい。
【0047】
次に、ステップS202において、MCU202は、受信したデータ列から0値の連続数(1バイト)を取り出す。次に、ステップS204において、MCU202は、ステップS202で取り出した0値の連続数分の0値を復元する。なお、データ列の先頭において、ステップS202で取り出した0値の連続数が"00h"の場合、データ列の先頭は、非0値である。この場合、MCU202は、ステップS204で0値を復元しない。
【0048】
次に、ステップS206において、MCU202は、データ列が終了した場合、
図8に示す処理を終了し、伸長していないデータ列がある場合、ステップS208を実行する。ステップS208において、MCU202は、データ列から非0値の連続数(1バイト)を取り出す。次に、ステップS210において、MCU202は、ステップS208で取り出した連続数分の非0値をデータ列から取り出す。次に、ステップS212において、MCU202は、データ列が終了した場合、
図8に示す処理を終了し、伸長していないデータ列がある場合、ステップS202を実行する。
【0049】
以上、第1の実施形態では、差分データが0値であるか非0値であるかに応じて圧縮データを生成することで、0値については、圧縮データ中に0値の連続数のみを配置すればよく、0値であることを示す情報を不要にすることができる。この結果、データ列である差分データの圧縮効率を向上させることができ、圧縮データを配信する場合のトラフィック量を削減することができる。また、ランレングス符号と同様に、圧縮データを順次読み出しながら伸長することができるため、MCU202が伸長時に使用するワークメモリの使用量を抑えることができる。
【0050】
(第2の実施形態)
図9は、本発明の第2の実施形態のデータ配信システムにおけるデータ配信装置による圧縮処理と機器による伸長処理との一例を示す説明図である。
図6と同様の要素については、詳細な説明は省略する。この実施形態では、出現する連続数の最大値を表現可能な最小限のビット数を使用して、連続数を表すことで、圧縮データのサイズを削減する。また、先頭データが0値、非0値のいずれであるかを示す情報をヘッダに付加することで、表現可能な最大の連続数を増やす。さらに、最終データが0値、非0値のいずれであるかを示す情報をヘッダに付加することで、圧縮データの末尾に付加するパディングが0値の連続数と判断されることを抑止する。
【0051】
図9に示す圧縮処理および伸長処理を実行するデータ配信システムSYSの構成は、
図1と同様である。すなわち、データ配信装置100は、圧縮処理部124(
図3)の機能が第1の実施形態と異なることを除き、
図2および
図3と同様である。機器200は、伸長処理部224(
図5)の機能が第1の実施形態と異なることを除き、
図4および
図5と同様である。
【0052】
図9においても、
図6と同様に、ファームウェアの更新データのうち、64バイトの差分データ列を圧縮および伸長する例を示す。この実施形態では、
図6に示した圧縮データであるボディの前にヘッダが配置される。すなわち、1バイト目の圧縮データの前にヘッダが配置される。
【0053】
まず、圧縮処理部124は、圧縮データを生成する差分データ列(この例では、64バイト)を読み出し、0値の連続数の最大値である第1最大連続数と、非0値の連続数の最大値である第2最大連続数とを算出する。
図9に示す例では、第1最大連続数は、"1Ah"であり、5ビットで表現可能である。第2最大連続数は、"02h"であり、2ビットで表現可能である。5ビットは、0値の第1最大連続数を表現可能な最小の第1ビット数の一例であり、2ビットは、非0値の第2最大連続数を表現可能な最小の第2ビット数の一例である。
【0054】
そして、圧縮処理部124は、予め設定された8ビットで表した第1最大連続数と、予め設定された6ビットで表した第2最大連続数とをヘッダに順次配置する。なお、第1最大連続数を表すビット数は、8ビットに限定されず、圧縮する差分データ列に含まれる0値の最大連続数に基づいて予め決定される。同様に、第2最大連続数を表すビット数は、6ビットに限定されず、圧縮する差分データ列に含まれる非0値の最大連続数に基づいて予め決定される。
【0055】
ここで、ファームウェアの更新データでは、差分データ列に含まれる第2最大連続数は、第1最大連続数より少ないことが統計的に分かっている。このため、第2最大連続数のビット数を第1最大連続数のビット数より小さくすることで、ヘッダのサイズを削減することができる。また、第2最大連続数をバイトではなくビットで表すことで、ヘッダのサイズを削減することができる。
【0056】
圧縮処理部124は、差分データ列の先頭の1バイトデータが0値であるか非0値であるかを示す1ビットの開始情報を第2最大連続数の後ろに配置する。例えば、開始情報の"0"は、先頭データが0値であることを示し、開始情報の"1"は、先頭データが非0値であることを示す。ヘッダに開始情報を配置することで、先頭データが非0値である場合に、ボディの先頭に非0値の連続数と非0値の連続数分の非0値自体を配置することができる。すなわち、ボディの先頭の0値の連続数を"0"に設定しなくてよい。
【0057】
このため、0値の連続数が"1"の場合、ボディに連続数"0"を配置し、0値の連続数が"100h"の場合、ボディに連続数"FF"を配置することができる。したがって、ボディに配置する0値の連続数の数(種類)を第1の実施形態に比べて増やすことができる。さらに、通常、ボディにおいて、0値の表現方法と非0値の表現方法とは統一されるため、ボディで表せる非0値の連続数も、第1の実施形態に比べて増やすことができる。
【0058】
なお、
図9では、説明が複雑になることを避けるため、ボディにおける0値の表現方法と非0値の表現方法は、第1の実施形態と同じとする。すなわち、例えば、0値および非0値の連続数が"1"の場合、ボディにそれぞれ連続数"1"が配置される。
【0059】
次に、圧縮処理部124は、差分データ列の末尾の1バイトデータが0値であるか非0値であるかを示す1ビットの終了情報を開始情報の後ろに配置する。例えば、終了情報の"0"は、末尾データが0値であることを示し、終了情報の"1"は、末尾データが非0値であることを示す。
【0060】
ボディがバイト単位でなくビット単位で表現される場合、ボディの最終バイトに、差分データでないパディングが付加される場合がある。このため、差分データの最後のデータが非0値であり、かつ、パディングが付加されている場合、伸長処理部224(
図5)がパディングを0値の連続数と判断しない仕組みが必要である。
【0061】
この実施形態では、ヘッダの終了情報で、末尾データが非0値であることが示された場合、伸長処理部224は、パディングを0値の連続数と判断せずに読み捨てることができる。この結果、ボディがビット単位で表される場合にも、圧縮データの伸長処理を正しく実行することができ、ファームウェアの更新処理を正常に実行することができる。
【0062】
ヘッダを生成した後、圧縮処理部124は、ボディにおいて、0値の連続数を、第1最大連続数を表現可能な5ビットで表し、非0値の連続数を、第2最大連続数を表現可能な2ビットで表す。非0値の連続数の後に配置される非0値自体は、
図6と同様に、1バイトで表される。
【0063】
これにより、この実施形態では、ヘッダが追加されるものの、ボディに配置される0値および非0値の連続数の総ビット数を削減することができるため、圧縮データの圧縮効率を、
図6に比べて向上させることができる。特に、0値と非0値とが繰り返される数が多いほど、圧縮効率を高くすることができる。この結果、機器200のファームウェアの更新データをデータ配信装置100から各機器200に配信する場合に必要なネットワークNWのトラフィック量をさらに削減することができる。
【0064】
図10および
図11は、第2の実施形態のデータ配信装置100の圧縮処理部124による圧縮処理の一例を示すフロー図である。すなわち、
図10および
図11は、データ配信装置100により実行されるデータ圧縮方法の一例を示す。例えば、
図10および
図11に示す処理は、データ配信装置100のプロセッサ102が、データ圧縮プログラムを実行することで実現される。
図7と同様の処理については、詳細な説明は省略する。
【0065】
まず、ステップS120において、プロセッサ102は、ファームウェアの更新データ(差分データ)であるデータ列を差分データ生成部122から入力する。次に、ステップS122において、プロセッサ102は、データ列における0値の連続数を全てカウントする。次に、ステップS124において、プロセッサ102は、ステップS122でカウントした0値の連続数の全てから最大の連続数である最大連続数を算出する。
【0066】
次に、ステップS126において、プロセッサ102は、データ列における非0値の連続数を全てカウントする。次に、ステップS128において、プロセッサ102は、ステップS126でカウントした非0値の連続数の全てから最大の連続数である最大連続数を算出する。次に、ステップS130において、プロセッサ102は、ステップS124、S126で算出した0値と非0値の最大連続数をヘッダとして出力する。
【0067】
次に、ステップS132において、プロセッサ102は、圧縮データを生成する差分データ列の先頭データが0値である場合、ステップS134を実行し、差分データ列の先頭データが非0値である場合、ステップS136を実行する。ステップS134おいて、プロセッサ102は、ヘッダの開始情報として、先頭データが0値であることを示す1ビットの"0"を出力し、ステップS138を実行する。ステップS136おいて、プロセッサ102は、ヘッダの開始情報として、先頭データが非0値であることを示す1ビットの"1"を出力し、ステップS138を実行する。
【0068】
ステップS138において、プロセッサ102は、圧縮データを生成する差分データ列の末尾データが0値である場合、ステップS140を実行し、差分データ列の末尾データが非0値である場合、ステップS142を実行する。ステップS140おいて、プロセッサ102は、ヘッダの終了情報として、末尾データが0値であることを示す1ビットの"0"を出力し、
図11のステップS144を実行する。ステップS142おいて、プロセッサ102は、ヘッダの終了情報として、末尾データが非0値であることを示す1ビットの"1"を出力し、
図11のステップS144を実行する。
【0069】
ステップS144において、プロセッサ102は、圧縮データを生成する差分データ列の先頭データが0値である場合、ステップS146を実行し、差分データ列の先頭データが非0値である場合、ステップS150を実行する。ステップS146において、プロセッサ102は、0値の連続数を圧縮データ(ボディ)として出力する。次に、ステップS148において、プロセッサ102は、データ列が終了した場合、
図10および
図11に示す処理を終了し、圧縮していないデータ列がある場合、ステップS150を実行する。
【0070】
ステップS150において、プロセッサ102は、非0値の連続数を圧縮データとして出力する。次に、ステップS152において、プロセッサ102は、ステップS150で出力した連続数分の非0値を順次出力する。次に、ステップS154において、プロセッサ102は、データ列が終了した場合、
図10および
図11に示す処理を終了し、圧縮していないデータ列がある場合、ステップS146を実行する。なお、プロセッサ102は、データ列が終了した場合であって、ボディの最終バイトに値を定めていないビットがある場合、パディングを付加する。
【0071】
図12および
図13は、第2の実施形態の機器200の伸長処理部224による伸長処理の一例を示すフロー図である。すなわち、
図12および
図13は、機器200により実行されるデータ伸長方法の一例を示す。例えば、
図12および
図13に示す処理は、データ配信装置100のMCU202が、データ伸長プログラムを実行することで実現される。
図8と同様の処理については、詳細な説明は省略する。
【0072】
まず、ステップS220において、MCU202は、ネットワークNWを介してデータ配信装置100からファームウェアの更新データ(差分データ)である圧縮データ(データ列)を受信する。すなわち、MCU202は、0値の第1最大連続数、非0値の第2最大連続数、開始情報および終了情報を含むヘッダと、0値の連続数、非0値の連続数および非0値とを含むボディとを入力する。
【0073】
例えば、MCU202は、データ列からヘッダを受信した後、ボディを受信する前にステップS222からステップS228を実行してもよい。あるいは、MCU202は、データ列からヘッダおよびボディを受信した後、ステップS222を開始してもよい。
【0074】
ステップS222において、MCU202は、受信したヘッダから0値の最大連続数を取り出し、ボディに格納された0値の連続数のビット数を算出する。次に、ステップS224において、MCU202は、受信したヘッダから非0値の最大連続数を取り出し、ボディに格納された非0値の連続数のビット数を算出する。次に、ステップS226において、MCU202は、受信したヘッダから開始情報を取り出す。次に、ステップS228において、MCU202は、受信したヘッダから終了情報を取り出す。
【0075】
次に、
図13のステップS230において、MCU202は、
図12のステップS226で取り出した開始情報に基づいて、受信したデータ列(圧縮データ)のボディの先頭データが0値であるか否かを判定する。MCU202は、先頭データが0値の場合、ステップS232を実行し、先頭データが非0値である場合、ステップS238を実行する。ステップS232からステップS242の処理は、
図8のステップS202からステップS212の処理とそれぞれ同様である。
【0076】
以上、第2の実施形態においても、第1の実施形態と同様に、0値については、圧縮データ中に0値の連続数のみを配置すればよく、0値であることを示す情報を不要にすることができる。さらに、第2の実施形態では、ボディに配置される0値および非0値の連続数を表すビット数を削減することで、ボディの総ビット数を削減することができる。これにより、圧縮データの圧縮効率を、第1の実施形態に比べて向上させることができる。この結果、機器200のファームウェアの更新データをデータ配信装置100から各機器200に配信する場合に必要なネットワークNWのトラフィック量をさらに削減することができる。
【0077】
ヘッダに開始情報を配置することで、先頭データが非0値である場合に、ボディの先頭の0値の連続数を"0"に設定しなくてよい。したがって、ボディに配置する0値の連続数の数(種類)を第1の実施形態に比べて増やすことができる。
【0078】
また、ヘッダに終了情報を配置することで、伸長処理部224は、末尾データが非0値である場合、パディングを0値の連続数と判断せずに読み捨てることができる。この結果、ボディがビット単位で表される場合にも、圧縮データの伸長処理を正しく実行することができ、ファームウェアの更新処理を正常に実行することができる。
【0079】
(第3の実施形態)
図14は、本発明の第3の実施形態のデータ配信システムにおけるデータ配信装置による圧縮処理と機器による伸長処理の一例を示す説明図である。
図6および
図9と同様の要素については、詳細な説明は省略する。この実施形態では、圧縮データのボディに連続数を格納する代わりに、出現する連続数を示すコード値を格納することで、ボディのサイズを削減する。
【0080】
図14に示す圧縮処理および伸長処理を実行するデータ配信システムSYSの構成は、
図1と同様である。すなわち、データ配信装置100は、圧縮処理部124(
図3)の機能が第1の実施形態と異なることを除き、
図2および
図3と同様である。機器200は、伸長処理部224(
図5)の機能が第1の実施形態と異なることを除き、
図4および
図5と同様である。
【0081】
この実施形態では、
図9と同様に、圧縮データであるボディの前にヘッダが配置される。図示は省略するが、以下では、ファームウェアの更新データのうち、
図6に示した64バイトの差分データ列を圧縮および伸長する例を示す。
【0082】
ヘッダは、
図9に示した第1最大連続数、第2最大連続数、開始情報および終了情報に加えて、差分データ列で出現可能な0値の全ての連続数に対応して、連続数の出現の有無を示す存在情報を有する。存在情報の数は、例えば、データ配信システムの設計時に、過去のファームウェアの更新に使用した差分データ列の0値の連続数の統計情報に基づいて決められる。
図14に示す例では、出現可能な1個から715個の0値の連続数の各々の存在の有無を示す715個の存在情報(各々1ビット)がヘッダに格納される。
【0083】
ボディは、0値の連続数を示すビット数が
図9と異なることを除き、
図9のボディと同じである。ボディに格納される0値の連続数は、実際に存在する0値の連続数の数(種類)を表現可能な最小限のビット数で示される。すなわち、ボディに格納される0値の連続数は、ヘッダにおいて"1"が設定された存在情報の総数を表現可能な最小限のビット数で示される。
【0084】
なお、この実施形態においても、ヘッダに開始情報が含まれるため、第2の実施形態と同様に、0値の連続数および非0値の連続数は、それぞれボディの1バイトを使用して1個から256個まで表すことができる。しかしながら、
図14においても説明が複雑になることを避けるため、ボディにおける0値の表現方法と非0値の表現方法は、第1の実施形態と同じとする。すなわち、例えば、0値および非0値の連続数が"1"の場合、ボディにそれぞれ連続数"1"が配置される。
【0085】
図14に示す例では、出現する0値の連続数は、"14h"、"1Ah"、"0Fh"の3種類であるため、ボディの格納される0値の連続数を示すコード値は、2ビットで表される。また、ボディに格納されるコード値は、連続数が小さい順に割り当てられる。
図14では、連続数"0Fh"、"14h"、"1Ah"に対して、2ビットのコード値"00"、"01"、"10"がそれぞれ割り当てられる。コード値は、圧縮データに含まれる0値の連続数を示す通し番号の一例である。
【0086】
図15は、第3の実施形態において、データ配信装置100の差分データ生成部122が生成する差分データの一例を示す説明図である。
図14で説明したように、0値の連続数の出現回数の最大値(715)は、過去のファームウェアの更新に使用した差分データ列の0値の連続数の統計情報に基づいて決定される。同様に、非0値の連続数の出現回数の最大値(12)は、過去のファームウェアの更新に使用した差分データ列の非0値の連続数の統計情報に基づいて決定される。
【0087】
例えば、差分データ生成部122が生成した差分データにおいて、0値の連続数が181通りあったとする(0h〜B4h)。この場合、ボディに格納する0値の連続数は、8ビットである。また、差分データにおいて、0値と非0値との組み合わせが860セットあったとする。
【0088】
一方、コード値ではなく、0値の連続数自体をボディに格納する場合、715通り(00h〜2CAh)の連続数を表現するために使用するビット数は、10ビットである。したがって、この実施形態では、ボディに0値の連続数自体を格納する場合に比べて、0値と非0値との組み合わせ毎に2ビットを削減することができる。
【0089】
例えば、差分データにおいて、0値と非0値との組み合わせが860セットある場合、ボディのサイズを1720ビット(860×2ビット)削減することができる。一方、連続数が715通りある場合、
図14に示したように、ヘッダのサイズは、715ビット増加する。したがって、この実施形態では、ボディに0値の連続数自体を格納する場合に比べて、圧縮データのサイズを125バイト(1720−715=1005ビット)削減することができる。
【0090】
なお、非0値の連続数の数(種類)は12種類であり、0値の連続数の数に比べて少ない。このため、非0値の連続数の存在情報は、ヘッダに格納されない。このため、圧縮データのボディに格納される非0値の情報は、
図9と同じである。なお、出現可能な非0値の連続数の数が、0値の連続数と同様に多い場合、非0値の連続数の存在情報をヘッダに格納してもよい。この場合、圧縮データのボディにおいて、非0値の出現個数は、実際に存在する連続数の数を表現可能な最小限のビット数で示される。
【0091】
図16は、第3の実施形態のデータ配信装置100の圧縮処理部124による圧縮処理の一例を示すフロー図である。すなわち、
図16は、データ配信装置100により実行されるデータ圧縮方法の一例を示す。例えば、
図16に示す処理は、データ配信装置100のプロセッサ102が、データ圧縮プログラムを実行することで実現される。
図7、
図10および
図11と同様の処理については、詳細な説明は省略する。
【0092】
まず、ステップS170において、プロセッサ102は、
図10のステップS120からステップS142の処理を実行することで、圧縮データのヘッダの前半部を生成する。次に、ステップS172において、プロセッサ102は、
図10のステップS122での0値の連続数の全てのカウント結果を用いて、0値の全ての連続数の存在情報を生成し、ヘッダの後半部として出力する。
【0093】
次に、ステップS174において、プロセッサ102は、実際に出現する0値の連続数の数に基づいて、圧縮データのボディに0値の連続数の代わりに格納するコード値のビット数を算出する。
図14の例では、2ビットに決定され、
図15の例では、コード値は8ビットに決定される。
【0094】
次に、ステップS176において、プロセッサ102は、
図11のステップS144からステップS154の処理を実行することで、圧縮データのボディを生成し、生成したボディを出力し、
図16に示す圧縮処理を終了する。また、ステップS176で実行される
図11のステップS146では、プロセッサ102は、0値の実際の連続数を出力する代わりに、連続数を示すコード値を出力する。
【0095】
図17は、第3の実施形態の機器200の伸長処理部224による伸長処理の一例を示すフロー図である。すなわち、
図17は、機器200により実行されるデータ伸長方法の一例を示す。例えば、
図17に示す処理は、データ配信装置100のMCU202が、データ伸長プログラムを実行することで実現される。
図8、
図12および
図13と同様の処理については、詳細な説明は省略する。
【0096】
まず、ステップS260において、MCU202は、
図12のステップS220からステップS228の処理を実行することで、圧縮データのヘッダの前半部を取り出す。次に、ステップS262において、MCU202は、圧縮データのヘッダの後半部から0値の全ての連続数の存在情報を取り出す。
【0097】
次に、ステップS264において、MCU202は、ステップS262で取り出した存在情報に基づいて、圧縮データのボディに格納されている0値の連続数を示すコード値のビット数を算出する。次に、ステップS266において、MCU202は、ステップS262で取り出した存在情報に基づいて、実際に存在する0値の連続数とコード値との対応表を生成する。例えば、対応表は、
図14の右上の枠内に示した"連続数"と"連続数のコード値"との情報を含む。すなわち、MCU202は、ヘッダから取り出した存在情報に基づいて、0値の存在する連続数に通し番号を割り当てる。
【0098】
次に、ステップS268において、MCU202は、
図13のステップS230からステップS242の処理を実行することで、圧縮データの伸長処理を実行し、
図17に示す処理を終了する。なお、MCU202は、ステップS266で生成した対応表を参照し、ボディから取り出した通し番号であるコード値に基づいて0値の連続数を抽出する。
【0099】
以上、第3の実施形態においても、上述した実施形態と同様に、0値については、圧縮データ中に0値の連続数のみを配置すればよく、0値であることを示す情報を不要にすることができる。また、圧縮データのヘッダに開始情報を配置することで、ボディに配置する0値の連続数の数(種類)を増やすことができる。さらに、圧縮データのヘッダに終了情報を配置することで、伸長処理部224は、末尾データが非0値である場合、パディングを0値の連続数と判断せずに読み捨てることができる。
【0100】
さらに、第3の実施形態では、0値の連続数の代わりに、実際に存在する連続数をコード化したコード値をボディに格納する。これにより、0値の連続数の有無を格納するヘッダのサイズは増加するものの、上述した実施形態に比べて、圧縮データのサイズをさらに削減することができる。
【0101】
(第4の実施形態)
図18は、本発明の第4の実施形態のデータ配信システムにおけるデータ配信装置による圧縮処理と機器による伸長処理との一例を示す説明図である。
図6、
図9および
図14と同様の要素については、詳細な説明は省略する。この実施形態では、連続数の出現頻度が高い範囲の連続数に割り当てるコード値のビット数を、連続数の出現頻度が低い範囲の連続数に割り当てるコード値のビット数より少なくすることで、圧縮データのボディのサイズを削減する。具体的には、連続数が小さい範囲ほど、連続数の代わりに割り当てるコード値のビット数を少なくし、連続数が大きい範囲ほど、連続数の代わりに割り当てるコード値のビット数を多くする。
【0102】
なお、この実施形態は、出現頻度の高いデータに短いコードを割り当てる点で、ハフマン符号に似ている。しかしながら、ハフマン符号では、データ量が大きいハフマン木を示す情報をヘッダに格納する必要があり、ボディのサイズを削減できても、ヘッダのサイズが大きいため、圧縮コード全体のサイズを削減できないおそれがある。さらに、圧縮データにヘッダを設ける場合、機器200に、ヘッダの情報を記憶しておくメモリ領域を確保する必要がある。このため、ヘッダのサイズは、小さい方が好ましい。
【0103】
図18に示す圧縮処理および伸長処理を実行するデータ配信システムSYSの構成は、
図1と同様である。すなわち、データ配信装置100は、圧縮処理部124(
図3)の機能が第1の実施形態と異なることを除き、
図2および
図3と同様である。機器200は、伸長処理部224(
図5)の機能が第1の実施形態と異なることを除き、
図4および
図5と同様である。
【0104】
この実施形態では、
図9および
図14と同様に、圧縮データであるボディの前にヘッダが配置される。ヘッダは、
図9に示した第1最大連続数、第2最大連続数、開始情報および終了情報に加えて、0値において出現可能な全ての連続数を複数の分割グループに分割したときの分割数Pzと、所定数の閾値tzとが配置される領域を有する。分割数Pzは、第1分割数の一例であり、分割数Pzにより分割される0値の連続数の分割グループは、第1グループの一例である。
【0105】
0値の閾値tzの個数は、分割数Pzより"1"少ない。分割数Pzが3個以上の場合、閾値tzは、第0閾値tz(0)から第Pz−2閾値tz(Pz−2)まで存在する。分割数Pzが2個の場合、閾値tzは、第0閾値tz(0)のみである。閾値tzについては、
図19〜
図21で説明する。
【0106】
さらに、ヘッダは、非0値において出現可能な全ての連続数を複数の分割グループに分割したときの分割数Pnと、閾値tnとが配置される領域を有する。分割数Pnは、第2分割数の一例であり、分割数Pnにより分割される非0値の連続数の分割グループは、第2グループの一例である。
【0107】
非0値の閾値tnの個数は、分割数Pnより"1"少ない。分割数Pnが3以上の場合、閾値tnは、第0閾値tn(0)から第Pz−2閾値tn(Pn−2)まで存在する。分割数Pnが2個の場合、閾値tnは、第0閾値tn(0)のみである。閾値tnについては、
図19〜
図21で説明する。
【0108】
添え字"z"は、0値に関するパラメータであることを示し、添え字"n"は、非0値に関するパラメータであることを示す。以下では、0値と非0値を区別せずにパラメータを示す場合、添え字"z"または添え字"n"が省略される場合がある。
【0109】
ボディは、0値の連続数を示すビット数と非0値の連続数を示すビット数とが
図9と異なることを除き、
図9および
図14のボディと同様である。ボディの枠外に示す符号"b"は、数値が2進数であることを示す。データ配信装置100の圧縮処理部124は、ボディに格納する0値および非0値の連続数を、後述する
図19および
図20に示すコード値として求める。例えば、ボディに格納された非0値のコード値は、
図19に示すコード値に対応する。
【0110】
この実施形態では、0値および非0値の連続数をそれぞれPz個およびPn個のグループに分割する。そして、出現可能な全ての連続数について、統計的に出現頻度が高いことが分かっている連続数が小さいグループほど、連続数を示すコード値を少ないビット数で表し、統計的に出現頻度が低いことが分かっている連続数が大きいグループほど、連続数を示すコード値を多いビット数で表現する。
【0111】
図19および
図20は、
図18に示すボディに格納する0値または非0値の連続数mに対応するコード値の例を示す説明図である。0値の連続数mに対応するコード値は、第1コード値の一例である。非0値の連続数mに対応するコード値は、第2コード値の一例である。
図19および
図20は、0値と非0値とに共通であるため、0値を示す添え字"z"と非0値を示す添え字"n"とは省略される。
【0112】
図19および
図20に示す符号"b"は、数値が2進数であることを示し、その他の値は10進数で示される。
図19および
図20では、説明を簡単にするために、存在しない連続数m="0"にコード値"00b"を割り当て、連続数m="12"まで対応可能にしている。しかし、実際には、連続数m="1"にコード値="00b"を割り当て、連続数m="2"〜"13"にコード値を順次割り当てることで、連続数m="13"まで対応させることができる。
【0113】
図19は、分割数Pが2個の場合の例を示す。分割数Pが2個の場合、分割グループは2個である。
図19では、1個の閾値t(0)="3"が使用される。
図19に網掛けで示す閾値t(0)="3"は、連続数mを順次増加させ、データ値v(1)を示す4ビットの使用が開始されるときのデータ値v(0)="3"と等しい。
【0114】
第0分割グループは、連続数m="1"、"2"を含み、データ値v(0)で示される2ビットのコード値で表される。第1分割グループは、連続数m="3"〜"12"を含み、データ値v(0)で示される2ビットとデータ値v(1)で示される4ビットとを合わせた6ビットのコード値で表される。
【0115】
図20は、分割数Pが3個の場合の例を示す。分割数Pが3個の場合、分割グループは3個である。
図20では、2個の閾値t(0)="2"、t(1)="1"が使用される。
図20に網掛けで示す閾値t(0)="2"は、連続数mを順次増加させ、データ値v(1)を示す1ビットの使用が開始されるときのデータ値v(0)である。同様に、
図20に網掛けで示す閾値t(1)="1"は、連続数mを順次増加させ、データ値v(2)を示す3ビットの使用が開始されるときのデータ値v(1)="1"に等しい。
【0116】
第0分割グループは、連続数m="1"を含み、データ値v(0)で示される2ビットのコード値で表される。第1分割グループは、連続数m="2"、"3"を含み、データ値v(0)で示される2ビットと、データ値v(1)で示される1ビットとを合わせた3ビットのコード値で表される。第2分割グループは、連続数m="4"〜"12"を含み、データ値v(0)で示される2ビットと、データ値v(1)で示される1ビットと、データ値v(2)で示される3ビットとを合わせた6ビットのコード値で表される。
【0117】
データ配信装置100の圧縮処理部124は、差分データ中に出現する連続数mに応じて、2進数で示したコード値を圧縮データのボディに格納する。例えば、圧縮処理部124は、連続数mとコード値との対応表と検索することで、連続数mに対応するコード値を求める。
【0118】
なお、圧縮処理部124は、複数組の分割グループの分割数Pと閾値t(p)の中から、コード値の平均ビット数が最小となる組み合わせ(最適解)を探索により求める。この際、圧縮処理部124は、複数種の分割数Pと閾値tとに対応して予め設けられる連続数mとコード値とを含む複数の対応表の中から最適な対応表を選択してもよい。
【0119】
図19および
図20に示すように、新旧のファームウェアのデータの差を示す差分データは、連続数mが少ない側での出現回数が多く、連続数mが多い側での出現回数が少ない場合がある。この場合に、小さい連続数mに対応する分割グループに割り当てるコード値のビット数を、大きい連続数mに対応する分割グループに割り当てるコード値のビット数より少なくすることで、連続数mを表すコード値の平均ビット数を削減することができる。この結果、圧縮データのボディのサイズを削減することができる。なお、圧縮処理部124は、最適解の探索により、
図19および
図20のうち、平均ビット数が少ない
図19を採用する。
【0120】
図21は、機器200の伸長処理部224がコード値から連続数を抽出する場合に使用する数式の一例を示す説明図である。
図21は、0値と非0値とに共通であるため、0値を示す添え字"z"と非0値を示す添え字"n"とは省略される場合がある。符号Mは、連続数mの最大値を示し、
図19および
図20では、M="12"である。符号mは、連続数の各々を示し、"1"から"M"で表される。符号Pは、分割数を示す。符号pは、分割グループ番号を示し、"0"から"P−1"で表される。
【0121】
符号t(p)は、p番目の閾値tを示し、
図19では、t(0)のみであり、
図20では、t(0)、t(1)である。なお、0値における閾値tz(p)は、分割グループ毎に割り当てられるコード値のビット数を得るための第1ビット数情報の一例である。非0値における閾値tn(p)は、分割グループ毎に割り当てられるコード値のビット数を得るための第2ビット数情報の一例である。
【0122】
符号v(p)は、コード値を構成するデータ値を示し、"0〜閾値t(p)−1"で示される。コード値を構成するデータ値v(p)の個数は、分割グループの番号が増加し、データ値v(p)が閾値t(p)に到達する毎に1つずつ増加する。
【0123】
図19では、閾値t(0)="3"であるため、データ値v(0)は、閾値t(0)より1つ小さい"0"、"1"、"2"のいずれかであり、2ビットで表されることが分かる。なお、実際には、データ値v(0)="0"は、使用されない。このため、第0分割グループの連続数mは、データ値v(0)を使用して"1"、"2"のいずれかになる。
【0124】
また、
図19では、データ値v(1)は、閾値t(1)がないため、閾値t(1)からは得られない。しかしながら、データ値v(1)は、閾値t(1)がないことから最後のデータ値v(1)であることが分かる。最後のデータ値v(1)は、例えば、連続数の最大値Mを表現可能なビット数(例えば、4ビット)で表される。データ値v(1)は、第0分割グループで表されない連続数m="3"から連続数の最大値M="12"までに対応する"0"〜"9"のいずれかである。このため、第1分割グループの連続数mは、データ値v(0)="3"とデータ値v(1)="0"〜"9"とを使用して、"3"〜"12"のいずれかになる。
【0125】
図20では、閾値t(0)="2"であるため、データ値v(0)は、閾値t(0)より1つ小さい"0"、"1"のいずれかであり、1ビットで表されることが分かる。このため、第0分割グループの連続数mは、データ値v(0)を使用して"1"のみになる。
【0126】
また、
図20では、閾値t(1)="1"であるため、データ値v(1)は、閾値t(0)より1つ小さい"0"のみであり、1ビットで表されることが分かる。このため、第1分割グループの連続数mは、データ値v(0)とデータ値v(1)とを使用して、"2"、"3"のいずれかになる。
【0127】
図20では、データ値v(2)は、閾値t(2)がないため、閾値t(2)からは得られない。しかしながら、データ値v(2)は、閾値t(2)がないことから最後のデータ値v(2)であることが分かる。最後のデータ値v(2)は、例えば、3ビットで表される。このため、第2分割グループの連続数mは、データ値v(0)とデータ値v(1)とデータ値v(2)とを使用して、"4"〜"12"のいずれかになる。
【0128】
符号r(p)は、数式を使用してコード値から連続数mを算出する場合に各データ値v(1)、v(2)に乗じる係数を示す。例えば、係数r(p)は、閾値t(p)を超える最小の2のべき乗から閾値t(p)を引くことで求められる。
図19では、係数r(0)は、"1"である。
図20では、係数r(0)は、"2"であり、係数r(1)は、"1"である。
【0129】
伸長処理部224は、圧縮データに含まれる差分データを伸長する場合、まず、分割数Pと、分割数Pに応じた個数の閾値t(p)をヘッダから取得する。次に、伸長処理部224は、閾値t(p)から係数r(p)を算出する。そして、伸長処理部224は、閾値t(p)と算出した係数r(p)とを、予め保持している数式に当てはめ、分割グループ毎に割り当てられた連続数mを求める。
【0130】
実際には、伸長処理部224は、コード値に対応する連続数mを判定できるまで、連続数に対応するコード値をボディから1ビットずつ取り出す。例えば、分割数P="2"で、閾値t(0)="3"の場合(
図19)、次のように、連続数を判定する。
【0131】
伸長処理部224は、コード値の最初の1ビット(第1ビット)が"0"の場合、連続数m="1"と判定する。伸長処理部224は、コード値の第1ビットが"1"の場合、次のビット(第2ビット)を取り出す。伸長処理部224は、第2ビットが"0"の場合、連続数m="2"と判定する。
【0132】
伸長処理部224は、第2ビットが"1"の場合、次の4ビット(第3ビット〜第6ビット)を取り出す。そして、伸長処理部224は、第3ビット〜第6ビットで示されるデータ値に応じて、連続数mを"3"〜"12"のいずれかであると判定する。
【0133】
また、分割数P="3"で、閾値t(0)="2"、閾値t(1)="1"の場合(
図20)、次のように、連続数を判定する。伸長処理部224は、コード値の最初の1ビット(第1ビット)が"0"の場合、連続数m="1"と判定する。伸長処理部224は、第1ビットが"1"の場合、次の2ビット(第2ビットと第3ビット)を取り出す。伸長処理部224は、第3ビットが"0"の場合、第2ビットの値に応じて連続数m="2"または"3"と判定する。
【0134】
伸長処理部224は、第3ビットが"1"の場合、第4ビット〜第6ビットを取り出す。そして、伸長処理部224は、第2ビットと第4ビット〜第6ビットで示されるデータ値に応じて、連続数mを"4"〜"12"のいずれかであると判定する。
【0135】
このように、伸長処理部224は、分割数Pと閾値t(p)とに基づいて決定される所定の規則に基づいて、連続数mが属する分割グループ毎に異なるコード値のビット値から連続数mを判定することができる。
【0136】
図22は、第4の実施形態のデータ配信装置100の圧縮処理部124による圧縮処理の一例を示すフロー図である。すなわち、
図22は、データ配信装置100により実行されるデータ圧縮方法の一例を示す。例えば、
図22に示す処理は、データ配信装置100のプロセッサ102が、データ圧縮プログラムを実行することで実現される。
図7、
図10、
図11および
図16と同様の処理については、詳細な説明は省略する。
【0137】
まず、ステップS180において、プロセッサ102は、
図10のステップS120からステップS142の処理を実行することで、圧縮データのヘッダの前半部を生成する。次に、ステップS182において、プロセッサ102は、ステップS122(
図10)でカウントした0値の全ての連続数に基づいて、ヘッダに格納する0値の連続数の分割数Pzと閾値tzとの最適解を探索する。また、プロセッサ102は、ステップS126(
図10)でカウントした非0値の全ての連続数に基づいて、ヘッダに格納する非0値の連続数の分割数Pnと閾値tnとの最適解を探索する。
【0138】
次に、ステップS184において、プロセッサ102は、ステップS182で最適解として得た0値の分割数Pzと閾値tzおよび非0値の分割数Pnと閾値tnをヘッダの後半部として出力する。ここで、最適解は、0値と非0値毎に、圧縮データのサイズが最も小さくなる分割数Pzおよび閾値tzと、分割数Pnおよび閾値tnとである。
【0139】
次に、ステップS186において、プロセッサ102は、ステップ182の探索で得た0値の最適解に対応する連続数のコード値を生成する。また、プロセッサ102は、ステップ182の探索で得た非0値の最適解に対応する連続数のコード値を生成する。
【0140】
次に、ステップS188において、プロセッサ102は、
図11のステップS144からステップS154の処理を実行することで、圧縮データのボディを生成し、生成したボディを出力し、
図22に示す圧縮処理を終了する。
【0141】
なお、ステップS188で実行される
図11のステップS146、S162では、プロセッサ102は、0値の実際の連続数を出力する代わりに、0値の連続数を示すコード値を出力する。また、ステップS186で実行される
図11のステップS150およびステップS156では、プロセッサ102は、非0値の実際の連続数を出力する代わりに、非0値の連続数を示すコード値を出力する。
【0142】
図23は、第4の実施形態の機器200の伸長処理部224による伸長処理の一例を示すフロー図である。すなわち、
図23は、機器200により実行されるデータ伸長方法の一例を示す。例えば、
図23に示す処理は、データ配信装置100のMCU202が、データ伸長プログラムを実行することで実現される。
図8、
図12、
図13および
図17と同様の処理については、詳細な説明は省略する。
【0143】
まず、ステップS270において、MCU202は、
図12のステップS220からステップS228の処理を実行することで、圧縮データのヘッダの前半部である第1最大連続数、第2最大連続数、開始情報および終了情報を取り出す。次に、ステップS272において、MCU202は、圧縮データのヘッダの後半部である0値の連続数の分割数Pzおよび閾値tzと、非0値の連続数の分割数Pnおよび閾値tnとを取り出す。
【0144】
次に、ステップS274において、MCU202は、
図13のステップS230からステップS242の処理を実行することで、圧縮データの伸長処理を実行し、
図23に示す処理を終了する。なお、ステップS274で実行される
図13のステップS232では、MCU202は、
図21で説明した手法により、0値の分割数Pzと閾値tzとに基づいて、ボディから取り出すコード値に対応する0値の連続数を得る。
【0145】
同様に、ステップS274で実行される
図13のステップS238では、MCU202は、
図21で説明した手法により、非0値の分割数Pnと閾値tnとに基づいて、ボディから取り出すコード値に対応する非0値の連続数を得る。
【0146】
以上、第4の実施形態においても、上述した実施形態と同様に、0値については、圧縮データ中に0値の連続数のみを配置すればよく、0値であることを示す情報を不要にすることができる。また、圧縮データのヘッダに開始情報を配置することで、ボディに配置する0値の連続数の数(種類)を増やすことができる。さらに、圧縮データのヘッダに終了情報を配置することで、伸長処理部224は、末尾データが非0値である場合、パディングを0値の連続数と判断せずに読み捨てることができる。
【0147】
さらに、第4の実施形態では、経験的に出現頻度の高い連続数に対応するコード値のビット数を少なくすることで、ボディのサイズをさらに削減することができる。この際、連続数を小さい順から大きい順に複数のグループに分割し、連続数が小さい側のグループに割り当てるコード値のビット数を、連続数が大きい側のグループに割り当てるコード値のビット数より少なくする。これにより、連続数の代わりにボディに格納される0値と非0値のコード値のビット数を最小限にすることができ、ヘッダのサイズを最小限にすることができる。この結果、上述した実施形態に比べて、圧縮データのサイズをさらに削減することができる。
【0148】
なお、上述した第4の実施形態では、分割数Pz、Pnと閾値tz、tnとに基づいて、0値と非0値の両方の連続数に代わるコード値をそれぞれ生成する例について述べた。しかしながら、0値と非0値の一方の連続数に代わるコード値を生成してもよい。
【0149】
以上、各実施形態に基づき本発明の説明を行ってきたが、上記実施形態に示した要件に本発明が限定されるものではない。これらの点に関しては、本発明の主旨をそこなわない範囲で変更することができ、その応用形態に応じて適切に定めることができる。
【解決手段】データ圧縮方法は、所定値である第1データと前記所定値以外の第2データとが繰り返し連続するデータ列を入力し、入力した前記データ列の先頭から、連続する前記第1データの数である第1連続数と、連続する前記第2データの数である第2連続数とを順次求め、求めた前記第1連続数と、求めた前記第2連続数と、求めた前記第2連続数分の前記第2データとを繰り返し配置して圧縮データを生成することを特徴する。