从C#通过网络发送gzip压缩的数据到Java(Sending gzipped data over

2019-10-30 02:13发布

我有把从数据源收集我的电脑(比如,Excel或Access)上接收应用程序在Android平板电脑数据的应用程序。 我在发送之前压缩数据,然后在接收后解压缩它的测试阶段。 我在C#端使用GZIP这一点,与DotNetZip和内置的GZIPInputStream类在Java端。

我在得到它的问题才能正常工作。 当我做一个测试只在一侧(压缩和解压,以查看数据是否保持不变),一切都很好。 它适用于C#和Java的。 但是,当我得到的数据点被发送过来,收到,我碰到这个问题:“未知格式(幻数ef1f)” 我在哪里见过这个已经讨论了其他SO职位,但答案似乎并没有帮助。

下面是我使用压缩的C#端的代码:

public void compressData() {
    byte[] buffer = Ionic.Zlib.GZipStream.CompressBuffer(this.RawStreamData.ToArray());
    this.RawStreamData = new MemoryStream(buffer);
}

这里是我用来在Java端解压缩的代码。 由于数据是由一个BufferedReader读入,我必须从炭[]转换为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#中我使用的是默认的,但据我所知没有在Java端没有这样的设置。 该BufferedReader中与ASCII编码创建。

Answer 1:

由于数据是由一个BufferedReader读入,我必须从炭[]转换为byte []最初:

这是一个巨大的问题。 你已经压缩的数据。 这是任意的二进制数据。 你绝对不应该把它当作文本。 目前尚不清楚对我有什么NetMessage是,但基本上你需要可以访问你在网络上发送的原始二进制数据-否则,你有没有解压缩它的机会。



Answer 2:

“该BufferedReader中与ASCII编码创建的。”那么很明显,你的程序无法正常工作。 gzip压缩的数据使用,因此将其解释为ASCII引起数据丢失的字节的所有位。 此外,在转换字符回一个字节数组而不指定编码,以便系统的默认使用这超出你程序的控制。 你必须使用相同的编码为转换,它必须使用ISO-LATIN-1将做的工作保留所有位的所有信息,如: 但它会是更好的解决字节转换为字符,并回字节该漏洞。



文章来源: Sending gzipped data over a network from C# to Java