解压数据从平铺json文件与zlib c++

Uncompress data from Tiled json file with zlib C++

本文关键字:文件 zlib c++ json 数据      更新时间:2023-10-16

我一直在尝试阅读,解码,然后压缩数据从json平铺文件,如下面的一个:

{ "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: nn%snn", 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): nn%snnn", b);
// Uncompress data
uncompress((Bytef *)c, &ucompSize, (Bytef *)b, compSize);
printf("Decoded (Uncompressed): nn%snnn", c);
return 0;
}

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

编码:

eJztmNkKwjAQRaN9cAPrAq5Yq3Xf6v9/nSM2VIbQJjEZR + nDwQZScrwztoORECLySBcIgZ7nc2y4KfyWDLx + Jb9nViNgDEwY + KioAXUgQN4 + zpoCMwPmQAtoAx2CLFbA2oDEo9 + hwG8DnIDtF/2 k8ks086tw2zh0uymv7hcrr/6/EvvhnsPrsrxwX7rwU/0 odig eV3mh3N1ld8eraWPaX6 + 64 s9mcesfrqchfg1mpoifxcvewjukyw + 9 atfpl/I71pER3Of6j4bv7HI54s + MChhqLlPdZ/P3qMmFuo5h5NnTOhjM5tReN2yT51n5 v7J3F0vi46fk + ne7aX0i9l6If7mpufTX3f5wsqv9TAD2fJLT9VrTn7UeZnM5tR + v0LMQOHXwFnxe2/warGFRWf8QDjOLfP

已解码(压缩):

x 234 355 230 331243 3020 e } u p 353 256 253 337 352 377 235 # 6 t 206 320, 1 g 351 303 301 rr 2743 266 203 221 362 201 236 347 sl 270 374 226 274 ~ % 277问# ' L 370 250 250 u@ 336>Κ346 @h 202 V 300ڀģߡ 300 234 200 355 375 212 362 k4 363 244 360 3331 364 273 #/w 354 257 376 277 373 341 236 303벼p_ 272 360 375苏(? y] 346 207 225 337 255 245 217我~ 276 353 213 = 1Ǭ~ 272 234 37052 232 356 223、364 e> _> zdgs 310 357 237 352> 277 261 310 347 213> 0(欧 250 271 237 317ޣ,223 gl 350 3529 207 233 c3 qxݲO 347 373 235克373 'qt 276。:~ O 247 {322/e 350 266 227 207 373 232 233 237} 337 347 * 277 324 311 - 300克?U 2559 373 q q g3 346 233 372 3751 207 _g 305 355 277 301 252 306 237 361

解码(未压缩):

程序以退出码结束:0

在解压缩之前,一切似乎都很好。我不知道哪里出了问题。任何帮助弄清楚这个是感激的。

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

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

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