【发布时间】: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