C#错误-Base-64字符串中的无效字符

C#错误-Base-64字符串中的无效字符,c#,C#,我正在编写一个C#程序集,以利用.NET framework较新版本中的GZip功能,并复制在其他地方成功使用的代码 其工作方式是,我们正在使用的应用程序向程序集提供一个流,程序集读取它,压缩它,然后将压缩结果作为字符串返回。然后通过流将该字符串放回程序集中以解压缩它(通常它会被存储,但我只是运行一个基本测试) 但是,当我将字符串反馈给程序集时,它在从应用程序流读取的字节数组中读取字符串时出错。代码如下: private void ReadStream(IStream stream, o

我正在编写一个C#程序集,以利用.NET framework较新版本中的GZip功能,并复制在其他地方成功使用的代码

其工作方式是,我们正在使用的应用程序向程序集提供一个流,程序集读取它,压缩它,然后将压缩结果作为字符串返回。然后通过流将该字符串放回程序集中以解压缩它(通常它会被存储,但我只是运行一个基本测试)


但是,当我将字符串反馈给程序集时,它在从应用程序流读取的字节数组中读取字符串时出错。代码如下:

    private void ReadStream(IStream stream, out byte[] data)
    {
        using (MemoryStream writer = new MemoryStream())
        {
            IntPtr rwBytes = Marshal.AllocHGlobal(4);
            int _rwBytes = 0;
            data = new byte[0xafc8];

            do
            {
                stream.Read(data, 0xafc8, rwBytes);
                _rwBytes = Marshal.ReadInt32(rwBytes);
                writer.Write(data, 0, _rwBytes);
            }
            while (_rwBytes > 0);
            writer.Close();

            Marshal.FreeHGlobal(rwBytes);
        }
    }

    public string CompressString([In, MarshalAs(UnmanagedType.AsAny)] object appStream)
    {
        byte[] buffer = null;
        ReadStream(appStream as IStream, out buffer);

        MemoryStream ms = new MemoryStream();
        using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
        {
            zip.Write(buffer, 0, buffer.Length);
        }

        ms.Position = 0;
        MemoryStream outStream = new MemoryStream();

        byte[] compressed = new byte[ms.Length];
        ms.Read(compressed, 0, compressed.Length);

        byte[] gzBuffer = new byte[compressed.Length + 4];
        System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
        System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
        string str = Convert.ToBase64String(gzBuffer);

        gzBuffer = Convert.FromBase64String(str);
        return str;
    }

    public string DecompressString([In, MarshalAs(UnmanagedType.AsAny)] object appStream)
    {
        byte[] buffer = null;
        ReadStream(appStream as IStream, out buffer);

        string compressedText = Encoding.UTF8.GetString(buffer); 

        byte[] gzBuffer = Convert.FromBase64String(compressedText);

        using (MemoryStream ms = new MemoryStream())
        {
            int msgLength = BitConverter.ToInt32(gzBuffer, 0);
            ms.Write(gzBuffer, 4, gzBuffer.Length - 4);

            buffer = new byte[msgLength];

            ms.Position = 0;
            using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
            {
                zip.Read(buffer, 0, buffer.Length);
            }
        }

        return Encoding.UTF8.GetString(buffer);
    }
CompressString函数返回的字符串为:

yK8AAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyK+ndd5WjRplk6rxarOm6aolmmbN+04TZ/n7cdN2uTU4jwt2vSqqt8241/jR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHz/67nR9j86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89/99/fjSCHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj5//7z49G8KPnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Px///nRCH70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj57/7z8/GsGPnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fP/nef/AYk/UbjIrwAA
在Encoding.UTF8.GetString调用中从流中读回时,它是:

yK8AAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyK+ndd5WjRplk6rxarOm6aolmmbN+04TZ/n7cdN2uTU4jwt2vSqqt8241/jR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHz/67nR9j86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89/99/fjSCHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj5//7z49G8KPnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Px///nRCH70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj57/7z8/GsGPnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fP/nef/AYk/UbjIrwAA

这些字符串是相同的。我甚至可以在CompressString函数中来回转换它,没有问题。有什么想法吗?这很奇怪。

不要使用UTF8,应该使用ascii文本编码。当您从字符串中获取字节时,由于UTF字符串的编码方式,您将得到一些额外的字节。

读取时出错-这是什么意思?有错误信息吗?你会得到什么错误,它发生在哪里?你能发布堆栈跟踪吗?仅仅因为两个字符串看起来相同并不意味着它们是相同的。您是否检查过两个字节数组,一个是转换为字符串之前的数组,另一个是转换回字节数组之后的数组?我敢打赌,它们是完全相同的,只是在开头或结尾有一些额外的字节。字符串未正确压缩,缺少Flush()。ReadStream()看起来已损坏,它应该将二进制零写入内存流。您看不到它们,但FromBase64String可以。