zlib充气方法给出错误的错误数据检查

时间:2019-07-19 11:43:21

标签: java gzip zlib

我有一个压缩的字节数组[]数据,我不知道在压缩过程中使用的压缩技术。当我尝试解压缩它时,它给我像“不正确的标头检查”之类的错误。为了解决这个问题,我在字节数组之前添加了78 9c(平均120,-100)。在此之后添加了实际字节数据,现在它给了我不正确的数据检查。它在inflator.inflate()方法处中断了。 我用一些硬编码的字节测试了decompress方法。对于某些字节,它给了我完美的字符串。但是对于某些给我的错误,有人可以帮助我解决这个问题吗?

byte[] missingBytes={9,0,4,5,2,64,-48,68,21,6,65,-48,-124,37,10,66,-4}

这是我原来的字节数组。

在将其发送到我使用过的解压缩方法之前

byte[] missingBytes={120,-100,9,0,4,5,2,64,-48,68,21,6,65,-48,-124,37,10,66,-4}

这是减压代码

public String decompressToString(byte[] bytesToDecompress)
        {   
            byte[] bytesDecompressed = this.decompress(bytesToDecompress);
            String returnValue = null;
            try{
                returnValue = new String(bytesDecompressed,0,bytesDecompressed.length,"UTF-8"); 
            }
            catch (UnsupportedEncodingException uee){
                uee.printStackTrace();
            }
            return returnValue;
        }

    public byte[] decompress(byte[] bytesToDecompress)
    {
        byte[] returnValues = null;
        Inflater inflater = new Inflater();
        int numberOfBytesToDecompress = bytesToDecompress.length;
        inflater.setInput(bytesToDecompress,0,numberOfBytesToDecompress);

        int bufferSizeInBytes = numberOfBytesToDecompress;

        int numberOfBytesDecompressedSoFar = 0;
        List<Byte> bytesDecompressedSoFar = new ArrayList<Byte>();
        try
        {
            while (inflater.needsInput() == false)
            {
                byte[] bytesDecompressedBuffer = new byte[bufferSizeInBytes];

                int numberOfBytesDecompressedThisTime = inflater.inflate(bytesDecompressedBuffer);

                numberOfBytesDecompressedSoFar += numberOfBytesDecompressedThisTime;

                for (int b = 0; b < numberOfBytesDecompressedThisTime; b++)
                {
                    bytesDecompressedSoFar.add(bytesDecompressedBuffer[b]);
                }
            }

            returnValues = new byte[bytesDecompressedSoFar.size()];
            for (int b = 0; b < returnValues.length; b++) 
            {
                returnValues[b] = (byte)(bytesDecompressedSoFar.get(b));
            }

        }
        catch (DataFormatException dfe)
        {
            dfe.printStackTrace();
        }

        inflater.end();

        return returnValues;
    }

0 个答案:

没有答案