解压数据从平铺json文件与zlib c++
Uncompress data from Tiled json file with zlib C++
我一直在尝试阅读,解码,然后压缩数据从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
)。实际上,在这种情况下,未压缩的数据主要由零组成。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 使用 boost zlib 从 std::vector 中的文件中读取压缩的 zraw 数据
- 如何使用 zlib.h 库将.zip文件解压缩到文件夹中
- 如何使用 zlib 在 zip 文件中添加/删除特定文件
- 使用 boost::iostreams 和 zlib 读取.gz文件的运行时错误
- 使用 zlib 解压缩.zip文件的简单方法
- 使用zlib/minizip:C/C++应用程序解压缩zip文件
- 解压数据从平铺json文件与zlib c++
- 如何使用C/ c++用zlib压缩目录或多个文件?
- 从c++文件调用zlib (C代码)
- 附加到压缩文件使用zlib
- c++ Zlib写入文件不工作
- Zlib gzopen()返回压缩文件流.是否解压缩文件
- 如何使用zlib创建一个与gz兼容的文件
- 用minizip/zlib从zip存档中加载文本文件,文件末尾有垃圾字符
- c++ zlib压缩文件中的字符串
- 使用zlib优化文件写入
- 使用 zlib 提取 gz 文件内容并保存
- Zlib解压缩.zip文件