1

タイル マップ データをゲームに直接ロードする .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);

いくつかのメモ: 簡潔にするために、エラー チェック (サンプル コードと私のコードには十分なものがありました) を削除しました。実行中にエラー メッセージは表示されませんでした。ただし、出力ファイルは空で、その理由はわかりません。

4

1 に答える 1

1

これを試して:

do 
{
    if ( strm.avail_in == 0 ){
       strm.avail_in = fread(in, 1, CHUNK, file);
       strm.next_in  = in;
    }
    strm.avail_out = CHUNK;
    strm.next_out  = out;

    ret            = inflate(&strm, Z_SYNC_FLUSH);
    have           = CHUNK - strm.avail_out;

    fwrite ( out, 1, have, dest ); //you forgot this step

} while (ret != Z_STREAM_END);
于 2011-03-10T01:15:56.907 に答える