如何在C#中缩小Minecraft块?

时间:2019-05-28 13:52:32

标签: c# minecraft zlib deflate

因此,我试图在使用c#的Unity3d中制作自己的Minecraft地图编辑器。我将此用作参考https://minecraft.gamepedia.com/Region_file_format。我能够解析区域文件的块表,然后可以使用该表查找以zlib魔术字节78 9C开头的压缩块。我的想法是使用System.IO.Compression.DeflateStream解压缩此数据块,但是当我这样做时,我收到来自IOException: Corrupted data ReadInternal的{​​{1}}方法的错误CheckResult。如果我将块导出到临时文件中并使用nodejs zlib对其进行充气,那么它可以工作,但是我认为它跳过了校验和,因为无论我给它提供多少数据,它都可以工作,并且还给我一些回报。

我无法想象.NET充气机坏了,所以我一定做错了事。我在压缩数据之前解析的压缩块长度似乎是错误的,因为据说我的第一个块是644个字节,但是当我在hexdump中查看文件时,在零填充之前我有1,230个字节。不幸的是,zlib块的3位标题表示该块是动态压缩的,因此我无法轻松确定EOB代码,而且我真的不理解RFC 1951,因此弄清楚deflate缓冲区结束和校验和开始的位置超出了我的范围。再说一次,nodejs zlib不在乎我是否给它644字节或1,230,但是为了获得完整的解压缩块,我假设我需要给它所有压缩数据。

有人解压缩了嵌入在砧区域文件中的Minecraft块是否给我一些见解?

1 个答案:

答案 0 :(得分:1)

因此,我从github编译了puff.c示例,该示例旨在演示夸大zlib缓冲区,并注意到解析器未解析该缓冲区的前两个“文件魔术”字节,我不知道该如何知道窗口大小,因为它被编码在那些字节中。但是无论如何,我想到了.NET充气机也不需要这些字节的想法。和ba!它解析。因此,对于任何想要给Minecraft块充气的提示,您需要将搜索偏移量创建为sectorIndex * 4096 + 7而不是sectorIndex * 4096 + 5到.mca文件中,对于任何从System.IO.Compression.DeflateStream得到校验和错误的人来说,也许您需要确保您向其发送的是RFC 1951缓冲区,而不是RFC 1950缓冲区。