【问题标题】:Uncompress data from Tiled json file with zlib C++使用 zlib C++ 从 Tiled json 文件中解压缩数据
【发布时间】:2016-01-24 03:01:52
【问题描述】:

我一直在尝试从 json Tiled 文件中读取、解码和压缩数据,如下所示:

{ "height":40,
 "layers":[
        {
         "compression":"zlib",
         "data":"eJztmNkKwjAQRaN9cAPrAq5Yq3Xf6v9\/nSM2VIbQJjEZR+nDwQZScrwztoORECLySBcIgZ7nc2y4KfyWDLx+Jb9nViNgDEwY+KioAXUgQN4+zpoCMwPmQAtoAx2CLFbA2oDEo9+hwG8DnIDtF\/2K8ks086Tw2zH0uyMv7HcRr\/6\/EvvhnsPrsrxwX7rwU\/0ODig\/eV3mh3N1ld8eraWPaX6+64s9McesfrqcHfg1MpoifxcVEWjukyw+9AtFPl\/I71pER3Of6j4bv7HI54s+MChhqLlPdZ\/P3qMmFuo5h5NnTOhjM5tReN2yT51n5\/v7J3F0vi46fk+ne7aX0i9l6If7mpufTX3f5wsqv9TAD2fJLT9VrTn7UeZnM5tR+v0LMQOHXwFnxe2\/warGFRWf8QDjOLfP",
         "encoding":"base64",
         "height":40,
         "name":"Ground",
         "opacity":1,
         "type":"tilelayer",
         "visible":true,
         "width":40,
         "x":0,
         "y":0
        }],
 "nextobjectid":1,
 "orientation":"orthogonal",
 "properties":
    {

    },
 "renderorder":"right-down",
 "tileheight":32,
 "tilesets":[
        {
         "firstgid":1,
         "source":"..\/..\/..\/Volumes\/Tiled 0.14.2\/examples\/desert.tsx"
        }],
 "tilewidth":32,
 "version":1,
 "width":40
}

我正在使用库 1. "json" (https://github.com/nlohmann/json), 2. "base64" (http://www.adp-gmbh.ch/cpp/common/base64.html) 和 3. "zlib" (http://zlib.net)。

这是我的代码:

#include <iostream>

#include <fstream>
#include <string>

#include "json.hpp"
#include "base64.hpp"
#include "zlib.h"

using json = nlohmann::json;

using namespace std;

int main(int argc, const char * argv[]) {

// Get string from json file
ifstream t("/Users/Klas/Desktop/testmap_zlib_compressed.json");
stringstream ss;
ss << t.rdbuf();
string sd = ss.str();

// Parse json string
auto j = json::parse(sd);

// Get encoded data
string encoded = j["layers"][0]["data"];

printf("Encoded: \n\n%s\n\n", encoded.c_str());

// Decode encoded data
string decoded = base64_decode(encoded);

// Convert string to char array
char b[decoded.size() + 1];
strcpy(b, decoded.c_str());

// Set size of uncompressed and compressed data
uLong h = j["layers"][0]["height"];
uLong w = j["layers"][0]["width"];
uLong ucompSize = w * h * 4; // Estimate
uLong compSize = strlen(b);

char c[ucompSize];

printf("Decoded (Compressed): \n\n%s\n\n\n", b);

// Uncompress data
uncompress((Bytef *)c, &ucompSize, (Bytef *)b, compSize);

printf("Decoded (Uncompressed): \n\n%s\n\n\n", c);

return 0;
}

当我使用 json 文件运行程序时,我得到了输出:

编码:

eJztmNkKwjAQRaN9cAPrAq5Yq3Xf6v9 / nSM2VIbQJjEZR + nDwQZScrwztoORECLySBcIgZ7nc2y4KfyWDLx + Jb9nViNgDEwY + KioAXUgQN4 + zpoCMwPmQAtoAx2CLFbA2oDEo9 + hwG8DnIDtF / 2K8ks086Tw2zH0uyMv7HcRr / 6 / EvvhnsPrsrxwX7rwU / 0ODig / eV3mh3N1ld8eraWPaX6 + 64s9McesfrqcHfg1MpoifxcVEWjukyw + 9AtFPl / I71pER3Of6j4bv7HI54s + MChhqLlPdZ / P3qMmFuo5h5NnTOhjM5tReN2yT51n5 / v7J3F0vi46fk + ne7aX0i9l6If7mpufTX3f5wsqv9TAD2fJLT9VrTn7UeZnM5tR + v0LMQOHXwFnxe2 / warGFRWf8QDjOLfP P>

解码(压缩):

x\234\355\230\331 \3020E\243}p\353\256X\253u\337\352\377\235#6T\206\320&1G\351\303\301Rr\2743\266\203\221"\362H\201\236\347sl\ 270)\374\226\274~%\277gV#`L\370\250\250u@\336>Κ3\346@h\202,V\300表示\300o\234\200\355\375\212\362K4 \363\244\360\3331\364\273#/\354w\257\376\277\373\341\236\303벼p_\272\360S\375(?y]\346\207su\225\337 \255\245\217i~\276\353\213=1Ǭ~\272\234\37052\232"h\356\223,>\364E>_\310\357ZDGs\237\352>\277\261\ 310\347\213>0(a\250\271Ou\237\317定&\3529\207\223gL\350c3\233Qx沲O\235g\347\373\373'qt\276.:~O\247{\266\227 \322/e\350\207\373\232\233\237M}\337\347*\277\324\300g\311-?U\2559\373Q\346g3\233Q\372\3751\207_g\305\ 355\277\301\252\306\237\361

解码(未压缩):

程序以退出代码结束:0

在解压缩之前,一切似乎都运行良好。我不确定出了什么问题。感谢任何帮助解决这个问题。

【问题讨论】:

  • 解压缩为 zlib 流。您没有检查uncompress() 的返回码。返回码是什么?第六条诫命:如果一个函数被宣传为在遇到困难时返回一个错误代码,你应该检查那个代码,是的,即使检查是你的代码大小的三倍并且让你的打字手指感到疼痛,因为如果你认为“这不可能发生在我身上”,神肯定会因你的傲慢而惩罚你。

标签: c++ json base64 zlib compression


【解决方案1】:

您不能对二进制数据使用strlen()。如果那里有一个零,它与二进制数据的长度无关。如果那里没有零,您将在数据末尾寻找零。使用decoded.size()

出于同样的原因,您不能使用strcpy()。使用memcpy()。或者在这种情况下,我不明白你为什么要复制它。只需将decoded.str()decoded.size()uncompress()

出于相同的原因,您不一定可以将压缩或未压缩的数据打印为字符串 (%s)。事实上,这种情况下未压缩的数据大部分由零组成。

【讨论】:

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