在服务器(C ++)上,使用ZLib
函数压缩二进制数据:
compress2()
并将其发送给客户端(Java)。 在客户端(Java),应使用以下代码片段解压缩数据:
public static String unpack(byte[] packedBuffer) {
InflaterInputStream inStream = new InflaterInputStream(new ByteArrayInputStream( packedBuffer);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int readByte;
try {
while((readByte = inStream.read()) != -1) {
outStream.write(readByte);
}
} catch(Exception e) {
JMDCLog.logError(" unpacking buffer of size: " + packedBuffer.length);
e.printStackTrace();
// ... the rest of the code follows
}
问题是当它尝试读取while循环时它总是抛出:
java.util.zip.ZipException:存储的块长度无效
在我检查其他可能的原因之前,有人可以告诉我,我可以使用compress2在一侧压缩,并使用上面的代码在另一侧解压缩,所以我可以消除这个问题吗?此外,如果有人可能有关于这里可能出错的线索(我知道我在这里没有提供太多的代码,但项目相当大。
感谢。
答案 0 :(得分:4)
InflaterInputStream
期待原始deflate数据(RFC 1951),而compress2()
正在生成zlib包装的deflate数据({19}围绕RFC 1951)。
RFC 1950会处理zlib包装的数据(除非你给它nowrap
选项)。去图。
答案 1 :(得分:0)
我认为问题不在于unpack方法,而在于packedBuffer内容。解包工作正常
public static byte[] pack(String s) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
DeflaterOutputStream dout = new DeflaterOutputStream(out);
dout.write(s.getBytes());
dout.close();
return out.toByteArray();
}
public static void main(String[] args) throws Exception {
byte[] a = pack("123");
String s = unpack(a); // calls your unpack
System.out.println(s);
}
输出
123