附加代码抛出java.util.zip.ZipException:给定.dat文件

时间:2015-10-26 14:26:15

标签: java inputstream zlib

我有一个使用flate编码的dat文件。 我正在尝试使用基于ZLib库的InflateInputStream来解码该文件。 但是使用下面的示例给我

     Exception in thread "main" java.util.zip.ZipException: incorrect data check

.dat文件保留here

代码: -

    int buflength = 1;
    byte[] buf = new byte[buflength];
    FileInputStream is = new FileInputStream(new File(INPUT_DIRECTORY + INPUT_FILE));
    Inflater decompresser = new Inflater();
    //decompresser.setInput(buf);
    InflaterInputStream ifis = new InflaterInputStream(is,decompresser,buflength);



    FileOutputStream os = new FileOutputStream(new File(OUTPUT_DIRECTORY + OUTPUT_FILE));
    /*Deflater compressor = new Deflater();
    DeflaterOutputStream dfos = new DeflaterOutputStream(os, compressor, buflength);
    */

    int counter = 0;
    //long bytesToCopy = 40000;
    int bytesThisRead = 0;
    long bytesCopied = 0;

    while ((bytesThisRead = ifis.read(buf, 0, buf.length)) != -1) 
    {
        os.write(buf, 0, bytesThisRead);
        System.out.println((counter++) + " " + bytesThisRead);

        //bytesToCopy -= bytesThisRead;
        bytesCopied += bytesThisRead;
    }

我尝试调试InflatterInputStream库中的代码,在那里我可以发现读取原始数据流中的最后一个字节存在一些问题。 (保持buf大小为1,然后在最后一个字节后出现错误)

此数据文件中,原始流的大小为11005,解码流的大小为36963。

那么如何解决最后一个字节损坏的问题呢?

1 个答案:

答案 0 :(得分:2)

制作zlib流(UL_obj_11_0_raw.dat)的人没有制作zlib流。最后的Adler-32检查应该以big-endian顺序存储,但它们以错误的顺序存储正确的检查值,little-endian。