1
我正在嘗試編寫一個.tmx加載器,它將直接將平鋪的地圖數據加載到我的遊戲中。我已經編寫了Base64解碼器並對字符串進行了解碼。從.tmx(平鋪)文件解壓縮zlib數據
但是,在解壓數據後,我沒有收到任何輸出。我會帶你看一個例子,以便你看到問題。
的.tmx文件,或者更確切地說,代碼我想與之合作的線,看起來是這樣的:
<data encoding="base64" compression="zlib">
eJzt1UEKwCAMBMBUsPXi/7+rH9CjSp2BPeWyEEgiAIA/yT3PIO/GXrdKPXUyY63ZPljPPs7iXp2lxPiffxt7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAtGh4aAGc=
</data>
首先,我有Base64編碼,zlib的壓縮數據列從.tmx文件:
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);
一些注意事項:我已刪除了錯誤檢查(示例代碼和我的代碼有很多),爲簡便起見我在運行過程中沒有收到任何錯誤消息。但輸出文件是空的,我不知道爲什麼。