0

嗨,我正在使用 GZIP 压缩和解压缩字符串。

得到一些例外!请帮帮我!

protected byte[] CompressInputString(String input_string2)
        throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream(
            input_string2.length());
    System.out.println("Byte Array OS : " + os);
    GZIPOutputStream gos = new GZIPOutputStream(os);
    System.out.println("GZIPOutputStream : " + gos);
    gos.write(input_string2.getBytes());
    System.out.println("GZIPOutputStream get bytes: "
            + input_string2.getBytes());
    gos.close();
    byte[] compressed = os.toByteArray();
    os.close();
    System.out.println("Compressed : " + compressed);
    return compressed;

}

protected String DecompressInputString(byte[] input_to_decode_from_function)
        throws IOException {
    final int BUFFER_SIZE = 32;
    ByteArrayInputStream is = new ByteArrayInputStream(input_to_decode_from_function);
    GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE);
    StringBuilder string = new StringBuilder();
    byte[] data = new byte[BUFFER_SIZE];
    int bytesRead;
    while ((bytesRead = gis.read(data)) != -1) {
        string.append(new String(data, 0, bytesRead));
    }
    gis.close();
    is.close();
    return string.toString();
}

我的输入是:abcdefghijklmnop

输出是

GZIPOutputStream : java.util.zip.GZIPOutputStream@f38798
GZIPOutputStream get bytes: [B@4b222f
Compressed : [B@b169f8
Compressed File : [B@b169f8

要解压缩,我应该提供什么输入?

如果我将[B@b169f8其作为字符串输入并使用 input.getBytes() 将其转换为字节数组并将其传递给我的解压缩函数,则会引发异常

不在 GZIP 正式异常日志中

4

3 回答 3

2

如果我将 [B@b169f8 作为字符串输入并使用 INPUT.getBytes() 将其转换为字节数组并将其传递给我的解压缩函数...引发异常

是的 - 因为“[B@b169f8”实际上不是字节数组的内容。这只是调用toString()它的结果;它基本上指示对象的类型及其哈希值。

如果你想以无损的方式将字节数组转换为字符串,则需要使用 base64 之类的东西。有很多库执行 base64 编码,包括这个公共领域的一个

此外,我强烈建议不要使用任何一个String.getBytes()String(byte[], int, int)构造函数。您应该始终指定编码。读取数据的最简单方法是创建一个InputStreamReader包装GZIPInputStream, 并直接从中读取文本数据。我建议使用 UTF-8 作为初始文本到二进制转换的编码(当然,在解压缩方面也是如此)。

于 2012-10-04T07:34:07.207 回答
0

首先,您将字节数组转换为使用字节数组的字符串.toString(),它返回其内存地址的表示,而不是其内容。

如果您确实需要将它作为介于两者之间的字符串,您将需要一种合理的方式将字节数组表示为字符串。Base64 是一种合理的方式来做到这一点。

然后,您需要在将其送入充气机之前将其转回字节数组。

或者,您可以跳过上述两个步骤,将字节数组保留为字节数组,然后将其直接提供给充气机。

于 2012-10-04T07:34:21.353 回答
0

对我来说很好,我试过这样调用你的方法:

public static void main(String[] args) throws Throwable {
    Test tf = new Test();
    byte[] compressed = tf.CompressInputString("Jimmy");
    System.out.println(Arrays.toString(compressed));
    String s = tf.DecompressInputString(compressed);
    System.out.println(s);//Prints "Jimmy"

}

您能否添加一个如何调用方法的示例,以及任何异常的完整堆栈跟踪?

于 2012-10-04T07:38:24.483 回答