将Gzipped数据从网络从C#发送到Java
-
20-12-2019 - |
题
我有一个应用程序,将从我的PC上的数据源收集的数据(例如,说,Excel或Access)收集到Android平板电脑上的接收应用程序。在发送之前压缩数据的测试阶段,然后在收到它之后将其解压缩。我正在使用gzip,在c#side上的dotnetzip和java侧的内置gzipinputstream类。
我有问题让它正常工作。当我在一侧进行测试时(压缩和解压缩以查看数据是否保持完整),一切都很好。它适用于C#和Java。但是,当我达到正在发送的数据并收到的数据时,我遇到了这个问题:“未知格式(魔术号EF1F)。”我已经看到了其他帖子,其中讨论过,但答案似乎没有帮助。
这是我在c#side上压缩的代码:
public void compressData() {
byte[] buffer = Ionic.Zlib.GZipStream.CompressBuffer(this.RawStreamData.ToArray());
this.RawStreamData = new MemoryStream(buffer);
}
.
在这里是我在java侧解压缩的代码。因为数据被缓冲区读取,所以我必须从char []转换为byte []最初:
public NetMessage decompressMsg(NetMessage nMsg) throws IOException {
ByteArrayOutputStream baOut = new ByteArrayOutputStream();
OutputStreamWriter osWriter = new OutputStreamWriter(baOut);
osWriter.write(nMsg.getRawMsg()); //.getRawMsg() returns a char[] of the raw data
osWriter.close();
ByteArrayInputStream baIn = new ByteArrayInputStream(baOut.toByteArray());
GZIPInputStream gzIn = new GZIPInputStream(baIn);
byte[] buffer = new byte[128];
int nReadBytes = gzIn.read(buffer);
String sDecompMsg = new String(buffer);
while (nReadBytes > -1) {
buffer = new byte[128];
nReadBytes = gzInput.read(buffer);
String sTemp = new String(buffer);
sDecompMsg += sTemp;
}
nMsg.setRawMsg(sDecompMsg.toCharArray());
return nMsg;
}
.
当我尝试构造gzipinputstream时,它会抛出异常。我已经知道我正在重建从生成的解压缩缓冲区的消息的方式是错误的(从java侧的测试中),但这是一个问题,我需要先达到! :) 任何帮助,将不胜感激。我怀疑它可能与压缩级别设置有关;在C#中我正在使用默认值,但是AFaik在Java侧没有这样的设置。使用ASCII编码创建BufferedReader。
解决方案
因为BufferedReader中读取了数据,我必须从Char []转换为Byte []最初:
这是一个巨大的问题。您已经压缩了数据。这是任意二进制数据。你应该绝对不是将其视为文字。这对我来说不清楚什么是世族统计古代代码,但基本上你需要访问你在网络上发送的原始二进制数据 - 否则你没有机会解压缩它。
其他提示
“使用ASCII编码创建BufferedReader。”然后,很明显,您的程序无法工作。GZIP压缩数据使用所有字节的字节,从而将其解释为ASCII导致数据丢失。此外,在不指定编码的情况下将CHARS转换回字节数组,以便使用系统的默认值,这些默认值超出了对程序的控制。您必须对两次转换使用相同的编码,并且它必须保留所有位的所有信息,例如,使用ISO-LATIN-1将完成这项工作。但是要修复将字节转换为字节并返回字节来更好。