English
PROGRAMMER'S GUIDE圧縮伸張ライブラリ
戻る進む
圧縮伸張ライブラリ/1.ガイド

 [圧縮ファイルフォーマット]
 以下の図と表は、ランレングス圧縮ファイルフォーマットを示します。

 符号には、次の2つの種類があります。連長が正の値か負の値かにより、2つを区別します。


図1.3 ランレングス圧縮ファイルフォーマット

表1.3 ランレングス圧縮ファイルヘッダ


1.3 伸張ライブラリ

 [概要]

 伸張ライブラリは、圧縮ツールで圧縮したデータを伸張します。
 圧縮データは、CD-ROM に独立したファイルとして格納しても、その他のどのような方法で持っていてもかまいません。ただし、伸張するときには、メイン CPU から直接アクセスできるメモリ上に、入力データバッファと出力データバッファを指定して伸張ライブラリを起動します。
 これらのいずれのバッファも、伸張ライブラリのユーザが確保し、そのアドレスをライブラリ関数に指定しなければなりません。
 たとえば、入力データを CD から読み取って伸張する場合も、1回の伸張処理の入力データを最後までメモリ上に読み込んでから、伸張ライブラリ関数を起動する必要があります。
 ユーザは、伸張ライブラリ関数に出力データバッファサイズも知らせます。ライブラリ関数は、伸張データがこのサイズを超えた場合、サイズを超えた位置には書き込みを行わず、処理を中断します。この機能を使って、途中までの伸張処理を意図的に行うことも可能です。
 ただし、中断した伸張処理を再開させる機能はありません。
 次の図は、伸張処理の概要を示します。

図1.4 伸張処理
in     :入力バッファ先頭アドレス。4バイト境界に合わせること。
out    :出力バッファ先頭アドレス。4バイト境界に合わせること。
bufsize:出力バッファサイズ。処理単位バイト数の整数倍。

 [モジュール構成]

 伸張ライブラリ関数は、機能的に見て階層的なモジュール構成になっています。 高位の関数は、圧縮時のアルゴリズムや、パラメータを解釈して伸張処理をするので利用しやすい面もありますが、余分なオブジェクトコードを抱えてリンクされるというデメリットもあります。
 必要最小限のオブジェクトコードだけをリンクしたい場合には、低位の関数を使用することができます。この場合は、圧縮ツール側の操作と違いがないよう注意が必要です。
 次の図は、伸張ライブラリのモジュール構成です。

図1.5 モジュール構成

 [使用例]

 伸張ライブラリ「CMPLIB.LIB」を利用したプログラム作成のために、ライブラリ関数を使用した例を示します。
 関数を起動するときは、圧縮データが、メイン CPU から直接アクセスできるメモリ上にあることが前提です。

 伸張ライブラリ使用例1
 次のサンプルに、C 言語の配列の形でソースファイルの中に圧縮データを持っている場合の例を示します。

<サンプル1>
#include "cmplib.h"

/*  圧縮データランレングス法で圧縮し、
    バイナリ・テキストコンバータで圧縮ファイルデータに変換   */

char comdata[] = {
	0x10, 0x01, 0x04, ・・・・・・・・
			:
			:
			:
	}

/*  伸張データバッファ(圧縮前のサイズより小さくないサイズを確保する。)  */
char outputbuf[4096];
			:
			:
			:

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
main()
{
	/*  伸張データポインタ  */
	char *buf;

	/*  伸張データバッファの先頭に設定  */
	bufp = outputbuf;

	/*  ランレングス辞書伸張  */
	CMP_DecRunlen(cmpdata, &bufp, sizeof(outputbuf));

	/*  伸張データの利用  */
			:
			:
			:
}

 伸張ライブラリ使用例2
 次のサンプルに、圧縮データを CD-ROM から読み込み伸張する場合の例を示します。

<サンプル2>

#include "sega_gfs.h"
#include "cmplib.h"

/*  ファイル読み込み用バッファ  */
Uint8 readbuf[READ_SIZE]
/*  伸張データバッファ  */
Uint8 outputbuf[4096]

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
main()
{
	GfsFid	fid;		/* ファイルサイズ識別子  */
	Sint32	fsize;		/*  ファイルサイズ  */
	char	*bufp;
	fid = 5;		/* 圧縮データファイル識別子を指定  */

	/* ファイルの一括読み込み  */
	fsize = GFS_Load(fid, 0, readbuf,READBUF_SIZE);

	/*  伸張データバッファの先頭に設定  */
	bufp = outputbuf;

	/*  ランレングス伸張  */
	CMP_DecRanlen(readbuf, &bufp, sizeof(outoutbuf));

	/*  伸張データの利用  */
			:
			:
			:
}


戻る進む
PROGRAMMER'S GUIDE圧縮伸張ライブラリ
Copyright SEGA ENTERPRISES, LTD., 1997