gpt4 book ai didi

c++ - c 中的 Minecraft NBT zlib 压缩未被游戏接受

转载 作者:行者123 更新时间:2023-11-28 07:37:46 27 4
gpt4 key购买 nike

我目前正在开发 NBT 读写器来编辑 Minecraft map (包括玩家数据和区 block 本身)。我已经完成了对 NBTData 的读取,并且能够编写一个 level.dat 文件来编辑一些玩家数据。

不幸的是,我仍然无法将 NBT 二进制数据写入区域文件,因为 Minecraft 不接受我的压缩方法。每当我尝试加载我编辑的 block 时,它都会给我一个错误,即找不到 ZLib 压缩的结尾或者它是一种无效的压缩方法(我通过终端启动 minecraft 发现了这些错误)。

我使用的是 Mac OSX 附带的 ZLib 库,编辑器是用 C++ 编写的。

这是我的压缩代码:

compressionData* compress(unsigned char* buf, int size)
{
vector<char> data = vector<char>();
for(int i = 0;i<size;i++)
data.push_back(buf[i]);

int ret;
z_stream zs;
char buff[4096];
std::vector<char> out_data;

// initialize zlib structure
memset(&zs, 0, sizeof(zs));
if(deflateInit(&zs, Z_BEST_COMPRESSION) != Z_OK)
return false;
zs.next_in = (Bytef *) data.data();
zs.avail_in = data.size();

// deflate blocks
do {
zs.next_out = reinterpret_cast<Bytef *>(buff);
zs.avail_out = 4096;

// deflate data and place in out_data
ret = deflate(&zs, Z_FINISH);
out_data.insert(out_data.end(), buff, buff + zs.total_out);
} while(ret == Z_OK);

// check for errors
deflateEnd(&zs);
if (ret != Z_STREAM_END)
return false;

// assign to data
data = out_data;

compressionData *rett = new compressionData();
rett->buf = (unsigned char*)malloc(data.size());
SharedStats::getSharedStats()->mallocated++;
for(int i = 0;i<data.size();i++)
rett->buf[i] = data.at(i);

rett->size = (int)data.size();

return rett;
}

compressionData 对象是一个结构,它只包含一个包含数据的无符号字符数组和一个表示数据长度(以字节为单位)的 int。

我应该为 Minecraft block 使用哪种 ZLib 加密方法?原始输入 block 总是以这三个字节开头:02 78 9C,我的 block 以 02 78 DA 开头。

block 中的所有数据都写在区域文件中,Minecraft 可以识别它们,只是不喜欢压缩方法。

伟大的,艾伦

最佳答案

out_data.insert(out_data.end(), buff, buff + zs.total_out); 似乎不正确。 total_out 字段是所有 deflate() 调用生成的数据总量,而不是刚刚进行的一次调用。 buff 中的实际字节数为 4096 - zs.avail_out

78 9c78 da 都是有效的 zlib header 。它们仅在识别所使用的压缩级别上有所不同,这对解压缩来说无关紧要。

我不知道 02 是从哪里来的。

关于c++ - c 中的 Minecraft NBT zlib 压缩未被游戏接受,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16403926/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com