2011-02-26 116 views
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); 

一些注意事项:我已删除了错误检查(示例代码和我的代码有很多),为简便起见我在运行过程中没有收到任何错误消息。但输出文件是空的,我不知道为什么。

回答

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);