Deflate - Inflate errors. Causing “incorrect header check” errors

拜拜、爱过 提交于 2020-06-29 06:51:20

问题


I am working on implementing a SAMLSLO through HTTP-REDIRECT binding mechanism. Using deflate-inflate tools gives me a DataFormatException with incorrect header check.

I tried this as a stand-alone. Though I did not get DataFormatException here I observed the whole message is not being returned.

    import java.io.UnsupportedEncodingException;
    import java.util.logging.Level;
    import java.util.zip.DataFormatException;
    import java.util.zip.Deflater;
    import java.util.zip.Inflater;


    public class InflateDeflate {
    public static void main(String[] args) {
    String source = "This is the SAML String";
            String outcome=null;
    byte[] bytesource = null;
    try {
        bytesource = source.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    int byteLength = bytesource.length;
    Deflater compresser = new Deflater();
    compresser.setInput(bytesource);
    compresser.finish();

    byte[] output = new byte[byteLength];
    int compressedDataLength = compresser.deflate(output);
    outcome = new String(output);
    String trimmedoutcome = outcome.trim();
    //String trimmedoutcome = outcome;  // behaves the same way as trimmed;
            // Now try to inflate it
    Inflater decompresser = new Inflater();
    decompresser.setInput(trimmedoutcome.getBytes());
    byte[] result = new byte[4096];
    int resultLength = 0;
    try {
        resultLength = decompresser.inflate(result);
    } catch (DataFormatException e) {
        e.printStackTrace();
    }
    decompresser.end();
    System.out.println("result length ["+resultLength+"]");
    String outputString = null;
    outputString = new String(result, 0, resultLength);
    String returndoc = outputString;
    System.out.println(returndoc);
    }

    }

Surprisingly I get the result as [22] bytes, the original is [23] bytes and the 'g' is missing after inflating.

Am I doing something fundamentally wrong here?


回答1:


Java's String is a CharacterSequence (a character is 2 bytes). Using new String(byte[]) may not correctly convert your byte[] to a String representation. At least you should specify a character encoding new String(byte[], "UTF-8") to prevent invalid character conversions.

Here's an example of compressing and decompressing:

import java.util.zip.Deflater;
import java.util.zip.InflaterInputStream;
...

byte[] sourceData; // bytes to compress (reuse byte[] for compressed data)
String filename; // where to write
{
    // compress the data
    Deflater deflater = new Deflater(Deflater.DEFAULT_COMPRESSION);
    deflater.setInput(sourceData);
    deflater.finish();
    int compressedSize = deflater.deflate(data, 0, sourceData.length, Deflater.FULL_FLUSH);

    // write the data   
    OutputStream stream = new FileOutputStream(filename);
    stream.write(data, 0, compressedSize);
    stream.close();
}

{
    byte[] uncompressedData = new byte[1024]; // where to store the data
    // read the data
    InputStream stream = new InflaterInputStream(new FileInputStream(filename)); 
    // read data - note: may not read fully (or evenly), read from stream until len==0
    int len, offset = 0;
    while ((len = stream.read(uncompressedData , offset, uncompressedData .length-offset))>0) {
        offset += len;
    }           
    stream.close();
}


来源:https://stackoverflow.com/questions/15696688/deflate-inflate-errors-causing-incorrect-header-check-errors

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!