GZipStream - 块长度与其补码不匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GZipStream - 块长度与其补码不匹配相关的知识,希望对你有一定的参考价值。

我试图通过TCP将对象作为字符串传输到另一台机器。我决定使用BinaryFormatter的组合,然后使用GZipStream,然后在发送之前使用Base64编码。在另一端,我做反向 - 解码字符串,GZipStream解压缩它,然后最终反序列化它。只有当我像这样实现它时它才起作用。获得'块长度与其补充不匹配'。例外

        string s = new String('@', 10000);
        string s2 = "";

        string data;

        using (var ms = new MemoryStream())
        {
            using (var gzip = new GZipStream(ms, CompressionMode.Compress))
            {
                var bf = new BinaryFormatter();
                bf.Serialize(gzip, s);

                gzip.Flush();
                ms.Flush();

                data = Convert.ToBase64String(ms.GetBuffer());
            }
        }

        using (var ms = new MemoryStream(Convert.FromBase64String(data)))
        {
            using (var gzip = new GZipStream(ms, CompressionMode.Decompress, true))
            {
                var binaryFormatter = new BinaryFormatter();
                s2 = binaryFormatter.Deserialize(gzip) as string;
            }
        }

        if (s != s2)
        {
            Console.WriteLine("Doesnt match");
        }

未处理异常中的结果:System.IO.InvalidDataException:块长度与其补码不匹配。

任何的想法?令我困惑的是,当我在本地摆脱Base64 enconding时,它工作正常。

答案

您需要先关闭GZipStream,然后将其分配给可变数据。

...
bf.Serialize(gzip, s);

gzip.Close();

data = Convert.ToBase64String(ms.GetBuffer());
另一答案

压缩的流没有被冲洗。尝试以下并关闭流。

private static byte[] Compress(Stream input)
    {
        using(var compressStream = new MemoryStream())
        using(var compressor = new DeflateStream(compressStream, CompressionMode.Compress))
        {
            input.CopyTo(compressor);
            compressor.Close();
            return compressStream.ToArray();
        }
    }

以上是关于GZipStream - 块长度与其补码不匹配的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试根据一些规则将字典键与其值匹配,而不使用其他库

代码签名的应用程序与其 Blessed Helper 的代码签名不匹配

如何在 C# 中使用 GZipStream 解压缩?

如何使用 GZipStream 解压缩内存中的 gz 文件?

原码反码补码

原码反码补码