タイル マップ データをゲームに直接ロードする .tmx ローダーを作成しようとしています。私は既に Base64 デコーダーを作成し、文字列をデコードしました。
ただし、データを解凍した後、出力がありません。問題を確認できるように、例を示します。
.tmx ファイル、または使用しようとしているコード行は次のようになります。
<data encoding="base64" compression="zlib">
eJzt1UEKwCAMBMBUsPXi/7+rH9CjSp2BPeWyEEgiAIA/yT3PIO/GXrdKPXUyY63ZPljPPs7iXp2lxPiffxt7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAtGh4aAGc=
</data>
まず、.tmx ファイルから Base64 でエンコードされ、zlib で圧縮されたデータ文字列を取得します。
std::string TmxSample = "eJzt1UEKwCAMBMBUsPXi/7+rH9CjSp2BPeWyEEgiAIA/yT3PIO/GXrdKPXUyY63ZPljPPs7iXp2lxPiffxt7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAtGh4aAGc=";
Base64 デコーダーを次のように実行します。
std::string DecodedTmxSample = Base64::decode(TmxSample);
そして得る
xœíÕA
À ÀT°õâÿ¿«Ð£J=å²H"
これが正しいとしか思えません。ウィキペディアの例でデコーダーを試してみたところ、正しい出力が得られました。したがって、Base64 デコーダーが間違っているとは思いません。結局のところ、圧縮解除後に少なくともある種のがらくたを返すか、ストリームエラーを返す必要がある出力があります。
私は zlib ライブラリと解凍サンプルのコピー アンド ペースト バージョンを使用していますzpipe.c
(関数はint inf(FILE *source, FIle *dest)
. この例では、出力 (デコードされた tmx 文字列) をファイルにすばやくコピーしました。主にコピペ)
#define CHUNK 16384
int ret;
unsigned have;
z_stream strm;
unsigned char in[CHUNK];
unsigned char out[CHUNK];
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = 0;
strm.next_in = Z_NULL;
ret = inflateInit(&strm);
FILE *file;
// Contains decoded data.
file = fopen("testFile", "r");
FILE *dest;
// We write decompressed data to this file.
dest = fopen("testOutFile", "w");
do
{
strm.avail_in = fread(in, 1, CHUNK, file);
strm.next_in = in;
do
{
strm.avail_out = CHUNK;
strm.next_out = out;
ret = inflate(&strm, Z_NO_FLUSH);
have = CHUNK - strm.avail_out;
} while (strm.avail_out == 0);
} while (ret != Z_STREAM_END);
いくつかのメモ: 簡潔にするために、エラー チェック (サンプル コードと私のコードには十分なものがありました) を削除しました。実行中にエラー メッセージは表示されませんでした。ただし、出力ファイルは空で、その理由はわかりません。