Java解压缩字节数组
在服务器(C++)上,使用Java解压缩字节数组,java,zip,gzip,zlib,Java,Zip,Gzip,Zlib,在服务器(C++)上,使用ZLib函数压缩二进制数据: compress2() 它被发送到客户端(Java)。 在客户端(Java),应使用以下代码段解压缩数据: public static String unpack(byte[] packedBuffer) { InflaterInputStream inStream = new InflaterInputStream(new ByteArrayInputStream( packedBuffer); ByteArrayOut
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在一边压缩,然后用上面的代码在另一边解压,这样我就可以消除这个问题了?此外,如果有人对这里可能出现的错误有可能的线索(我知道我在这里没有提供太多的代码,但项目相当大)
谢谢。我认为问题不在于解包方法,而在于打包缓冲内容。解包工作正常
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
刚刚发现这个,可能是helfful:你验证过你在客户端得到正确的数据了吗?例如,你的
packedBuffer
大小合适吗?@Jon Skeet,因为这是一个大系统的遗留代码,首先我想知道我是否可以使用compress2解压用zlib压缩的东西,使用我在上面发布了java代码,所以我可以继续调查问题出在哪里。@乘客:但我的观点是,你不应该仅仅从一个方面来诊断这个问题。你应该看看compress2()的结果
,对照Java代码中接收到的数据检查长度和数据本身。如果接收到错误的数据,就没有希望正确接收。@Jon Skeet感谢您的努力。是的,我知道这一点,这是我的下一步,但由于这是最容易检查的,而且我在Java中没有太多经验,所以我只是想先检查一下,是否可以使用上面粘贴的Java函数对一侧带有compress2的正确压缩块进行解压缩?请不要建议使用这样的平台默认编码-它非常不可移植。当从字符串转换为字节数组或从字节数组转换为字节数组时,您应该始终指定编码。感谢您的回复Posid,但它也意味着,在某些C++代码中使用ZLIB压缩(使用CysS2函数)应该能够用java解压缩函数解压缩吗?java. UTIL.ZIP是基于ZLIB压缩库(原生DLL)的。我认为它与C++的LILB兼容,但是如果C++用C++解压缩PACKEDDjava,那么它就被压缩成不同的格式。