【问题标题】:Decompressing zlib data from .tmx (Tiled) file从 .tmx(平铺)文件中解压缩 zlib 数据
【发布时间】:2011-07-04 23:03:45
【问题描述】:

我正在尝试编写一个 .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"

我只能假设这是正确的。我在 Wikipedia 示例上尝试了我的解码器,它给了我正确的输出。因此,我并不是假设我的 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);

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

【问题讨论】:

    标签: c++ base64 zlib tmx


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多