gpt4 book ai didi

java - GZIPInputStream 无法在接收方解码(设置的代码长度无效)

转载 作者:行者123 更新时间:2023-12-01 20:57:27 25 4
gpt4 key购买 nike

我正在尝试使用 GZIPOutputStream 在客户端中对字符串进行编码,然后使用 GZIPOutputStream 在服务器中对字符串进行解码。

客户端代码(在初始套接字连接建立之后)是:

// ... Establishing connection, getting a socket object.
// ... Now proceeding to send data using that socket:

DataOutputStream out = new DataOutputStream(socket.getOutputStream());
String message = "Hello World!";

ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(message);
gzip.close();
String encMessage = out.toString();

out.writeInt(encMessage.getBytes().length);
out.write(encMessage.getBytes());
out.flush();

以及服务器端代码(同样,在建立连接之后):

DataInputStream input = new DataInputStream(socket.getInputStream());

int length = input.readInt();
byte[] buffer = new byte[length];
input.readFully(buffer);

GZIPInputStream gz = new GZIPInputStream(new ByteArrayInputStream(buffer));
BufferedReader r = new BufferedReader(new InputStreamReader(gz));
String s = "";
String line;
while ((line = r.readLine()) != null)
{
s += line;
}

我检查过,缓冲区长度(即编码消息的大小)已正确传递,因此传输了正确的字节数。但是,我得到了这个:

java.util.zip.ZipException: invalid code lengths set
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:122)
at parsing.ReceiveResponsesTest$TestReceiver.run(ReceiveResponsesTest.java:147)
at java.lang.Thread.run(Thread.java:745)

有什么想法吗?

预先感谢您的帮助!

最佳答案

您在 ByteArrayOutputStream 上调用 toString() - 这是不正确的,它会引发各种字符编码问题,这些问题可能会困扰您。您需要改为调用 toByteArray:

byte[] encMessage = out.toByteArray();

out.writeInt(encMessage.length);
out.write(encMessage);

详细信息:

如果您使用toString(),Java 将以您的平台默认字符编码对您的字节进行编码。这可能是一些 Windows 代码页、UTF-8 或其他什么。然而,并非所有字符都可以正确编码,有些字符将被替换字符 - 也许是问号。在不了解细节的情况下,很难说清楚。

但无论如何,将字节数组编码为字符串,然后写出来时再次解码为字节数组,很有可能会改变字节数组中的数据。并且不需要这样做,您可以直接获取字节数组,如上面的代码所示。

关于java - GZIPInputStream 无法在接收方解码(设置的代码长度无效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42060427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com