我一直在尝试从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
解码(压缩):
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&gt;Κ3\ 346 @ h \ 202,V \ 300ڀģߡ\ 300 o \ 234 \ 200 \ 355 \ 375 \ 212 \ 362K4 \ 363 \ 244 \ 360 \ 3331 \ 364 \ 273#/ \354瓦特\ 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&GT; \ 364E&GT; _ \ 310个\ 357ZDGs \ 237 \ 352&GT; \ 277 \ 261 \ 310 \ 347 \ 213大于0(一\ 250 \ 271Ou \ 237 \ 317ޣ&安培; \ 3529 \ 207 \ 223gL \ 350c3 \ 233QxݲÓ\235克\ 347 \ 373 \ 373'qt \ 276:〜ø\ 247 { \ 266 \ 227 \ 322 / E \ 350 \ 207 \ 373 \ 232 \ 233 \ 2.37亿} \ 337 \ 347 * \ 277 \ 324 \300克\ 311-?U \ 2559 \ 373Q \ 346g3 \ 233Q \ 372 \ 3751 \ 207_g \ 305 \ 355 \ 277 \ 301 \ 252 \ 306 \ 237 \ 361
解码(未压缩):
程序以退出代码结束:0
在解压缩之前,一切似乎都运转正常。我不确定出了什么问题。任何帮助来解决这个问题表示赞赏。
答案 0 :(得分:0)
您不能对二进制数据使用strlen()
。如果那里有零,则它与二进制数据的长度无关。如果那里没有零,你将运行数据的末尾寻找零。使用decoded.size()
。
出于同样的原因,您无法使用strcpy()
。使用memcpy()
。或者在这种情况下,我不明白为什么你甚至会复制它。只需将decoded.str()
和decoded.size()
提交给uncompress()
。
您不一定要将压缩或未压缩的数据打印为字符串(%s
),再次出现相同的原因。事实上,在这种情况下,未压缩的数据主要由零组成。