2

我在高中,需要为我的 ap 计算机编程课程完成一个项目。基本上,我的老师在java中回顾了zlib解压缩和压缩,并告诉我们制作一个小java程序来解压一些压缩数据。我想补充一点,我是一个 Minecraft 上瘾者,发现 minecraft 中的块在 zlib 中被压缩,所以我开始解压缩这些块。无论如何,代码不起作用,我必须在星期二之前完成它。我犯了什么错误?所有帮助将不胜感激。代码:

public static void read(String filein) throws IOException, DataFormatException{
    //Initialize
    ArrayList<Byte> bufflist = new ArrayList<Byte>();
    File file = new File(filein);
    RandomAccessFile mcr = new RandomAccessFile(file, "r");
    RandomAccessFile cache = new RandomAccessFile("cache", "rw");
    RandomAccessFile out = new RandomAccessFile("out", "rw");

    //read file
    int dataread = 0;
    mcr.seek(8192);
    while (dataread < file.length() - 8192){
        dataread = dataread + 1;
        byte b = mcr.readByte();
        bufflist.add(b);
    }
    mcr.close();
    //decode
    for (int y=0; y<bufflist.size()-1; y++){
        cache.write(bufflist.get(y));
    }
    InflaterInputStream infl = new InflaterInputStream(new FileInputStream("cache"), new Inflater());
    int data = infl.read();
    out.write(data);
}
public static void main(String[] args) throws IOException, DataFormatException
{
    read("r.1.1.mca");      
}
4

2 回答 2

3

请注意:虽然有许多工具使用 zlib 进行(解)压缩,但结果以多种不同(专有)文件格式存储。- 即使压缩算法匹配,您也需要知道压缩数据存储在哪种格式中才能解压缩。

那么,您确定在输入文件的偏移量 8192 处遵循的是 zlib 期望的格式的数据流吗?- 我不会认为它是专有文件格式。使用普通的 zlib,您甚至无法解压缩常见的 PKZIP(“.zip”)存档。不要在这上面浪费你的时间,而是找一些其他的数据来玩。

您可能想尝试首先通过 zlib 压缩一些已知数据,将其存储到文件或其他任何文件中,如果您愿意,可以查看它。然后,把那个压缩数据文件交给zlib,看看你能不能把它解压成原始形式。如果你能做到这一点,你就已经学到了很多关于如何使用 zlib 的知识。

对于其他任务,例如处理那些“.zip”文件,您可能需要查看java.util.zip包中的 Java API。

哦,顺便说一句:“未知压缩方法”的结果可能有点误导。这仅表明 zlib 无法确定如何解压缩给定数据,这通常是由“损坏”输入引起的,至少在给定的形式中,zlib 首先无法处理。

至于你的代码:

确保在尝试写入之前删除输出文件;以您的方式写入现有文件会将数据附加到文件的现有数据中,而不是替换旧字节。

在尝试close()通过新的InputStream.

在你的for循环y<bufflist.size()-1中实际上应该是y<bufflist.size().

您可以省去所有这些bufflist东西:只需替换bufflist.add(b);cache.write(b);.

于 2012-11-11T17:50:16.023 回答
2

IIRC,在 Anvil 中,每个 .mca 文件都存储多个单独压缩的“部分”,因此每当修改某些内容时都不需要重新压缩整个块。

在这里查看 McRegion/Anvil 转换器。这是了解如何打包 anvil 文件的一个很好的起点。

祝你的项目好运!

于 2012-11-11T19:09:45.540 回答