java - java中的Zlib解压缩不起作用

标签 java php android compression zlib

我正在使用 PHP 5.4.4-14+deb7u7 压缩一个字符串

$cdat = gzcompress($dat, 9);

http://php.net/manual/en/function.gzcompress.php

然后在 android/java 中我想解压它,从这里: Android: decompress string that was compressed with PHP gzcompress()

我正在使用:

public static String unzipString(String zippedText) {
    String unzipped = null;
    try {
        byte[] zbytes = zippedText.getBytes("ISO-8859-1");
        // Add extra byte to array when Inflater is set to true
        byte[] input = new byte[zbytes.length + 1];
        System.arraycopy(zbytes, 0, input, 0, zbytes.length);
        input[zbytes.length] = 0;
        ByteArrayInputStream bin = new ByteArrayInputStream(input);
        InflaterInputStream in = new InflaterInputStream(bin);
        ByteArrayOutputStream bout = new ByteArrayOutputStream(512);
        int b;
        while ((b = in.read()) != -1) {
            bout.write(b); 
        }
        bout.close();
        unzipped = bout.toString();
    } catch (IOException e) { 
    }
    return unzipped;
 }

但是我试了一下,解压成一个空字符串,而android中下载的压缩字符串真的很长。

下载的字符串是这样的

x�͜{o�8�a`�= �!�����[��K!(6c�E�$��]�)�HF��F\!����ə���L�LNnH]Lj٬T��M���f�'�u#�*_�7'�S^�w��*kڼn�Yޚ�I��e$.1C��~�ݟ��F�A�_Mv_�R͋��ܴ�Z^L���sU?A���?�׮�ZVmֽ6��>�B��C�M�*����^�sٸ�j����������?�"_�j�ܣY�E���h0�g��w[=&�D �oht=>�l�?��Po";`.�e�E�E��[���������sq��0���i]��������zUL�O{П��ժ�k��b�.&7��-d1_��ۣ�狝�y���=F��K!�rC�{�$����c�&9ޣH���n�x�

有人知道问题出在哪里吗?

谢谢。

public static Pair<String,Integer> GetHTTPResponse(String url, List<NameValuePair> urlparameters) {
    String responseVal = null;
    int responseCode = 0;

    try {
        HttpParams httpParameters = new BasicHttpParams();
        int timeoutConnection = TIMEOUT_SECONDS * 1000;
        HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
        int timeoutSocket = TIMEOUT_SECONDS * 1000;
        HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

        HttpClient client = new DefaultHttpClient(httpParameters);
        HttpPost httppost = new HttpPost(url);

        httppost.setEntity(new UrlEncodedFormEntity(urlparameters));
        HttpResponse response = client.execute(httppost);
        responseCode = response.getStatusLine().getStatusCode();    

        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

        responseVal = Common.GetStringFromBufferedReader(rd);

        Log.d("SERVER", responseVal);
    }
    catch (Exception e) {
        responseCode = 0;
    }

    if (responseVal != null) {
        responseVal = Common.unzipString(responseVal);
    }

    return new Pair<String, Integer>(responseVal, responseCode);
}

最佳答案

你不能使用

BufferedReader rd = 
    new BufferedReader(new InputStreamReader(
        response.getEntity().getContent()));
responseVal = Common.GetStringFromBufferedReader(rd);

作为InputStreamReader的 Javadoc 注释,

An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified charset.

相反,您可以使用 HttpEntity.writeTo(OutputStream)和一个 ByteArrayOutputStream喜欢

ByteArrayOutputStream baos = new ByteArrayOutputStream();
response.getEntity().writeTo(baos);
byte[] content = baos.toByteArray();

然后您可以直接将内容传递给那个byte[] 中的函数,并且从不静静地吞下一个Exception

public static String unzipString(byte[] zbytes) {
    String charsetName = "ISO-8859-1";
    String unzipped = null;
    try {
        // Add extra byte to array when Inflater is set to true
        byte[] input = new byte[zbytes.length + 1];
        System.arraycopy(zbytes, 0, input, 0, zbytes.length);
        input[zbytes.length] = 0;
        ByteArrayInputStream bin = new ByteArrayInputStream(input);
        InflaterInputStream in = new InflaterInputStream(bin);
        ByteArrayOutputStream bout = new ByteArrayOutputStream(512);
        int b;
        while ((b = in.read()) != -1) {
            bout.write(b); 
        }
        bout.close();
        unzipped = bout.toString(charsetName);
    } catch (IOException e) { 
        e.printStackTrace();
    }
    return unzipped;
 }

关于java - java中的Zlib解压缩不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26825900/

相关文章:

java - 解压缩 GZIP http-response(使用 jersey client api,java)

PHP异步多文件读写

android - 如何在windows xp中安装Android SDK和eclipse?

java - 用Java渲染图像

java - 在 Java 中生成数百万个随机字符串

java - URL.setURLStreamHandlerFactory

php - 谷歌表 API 4 : How to append to the end of the row with PHP

php - 从本地主机发送电子邮件到外部电子邮件帐户

Android 小部件大小不正确

android - 从 SQLite 迁移到 Android Room Persistence Library