error "stream not support reading"

0

I get this error back:

stream not support reading

code:

internal static byte[] Compress(byte[] data)
        {
            MemoryStream memout = new MemoryStream();
            using (MemoryStream memin = new MemoryStream(data))
            {
                using (CryptoStream crypto = new CryptoStream(memin, new DESCryptoServiceProvider().CreateEncryptor(new UTF8Encoding().GetBytes("87654321"), new UTF8Encoding().GetBytes("12345678")), CryptoStreamMode.Write))
                {
                    using (DeflateStream stream = new DeflateStream(crypto, CompressionMode.Compress))
                    {
                        byte[] buffer = new byte[4096];
                        int numRead;
                        while ((numRead = stream.Write(buffer, 0, buffer.Length)) != 0)
                        {
                            memout.Write(buffer, 0, numRead);
                        }
                    }
                }
            }
            return memout.ToArray();
        }

Returns the same error:

internal static byte[] Compress(byte[] data)
        {
            MemoryStream memout = new MemoryStream();
            using (MemoryStream memin = new MemoryStream(data))
            {
                using (CryptoStream crypto = new CryptoStream(memin, new DESCryptoServiceProvider().CreateEncryptor(new UTF8Encoding().GetBytes("87654321"), new UTF8Encoding().GetBytes("12345678")), CryptoStreamMode.Write))
                {
                    using (DeflateStream stream = new DeflateStream(crypto, CompressionMode.Compress)) { 
                        stream.CopyTo(memout);
                        memout.Position = 0;
                    }
                }
            }
            return memout.ToArray();
        }

and I do not know why it gives this error.

    
asked by Tecnology Now 28.10.2017 в 01:47
source

2 answers

1

You are chaining the streams incorrectly. You are using CryptoStream and DeflateStream in read mode, when it should be the other way around. Note your use of CryptoStreamMode.Write .

Rather, use CryptoStream in write mode, passing memout instead of memin .

Code example:

internal static byte[] Compress(byte[] data)
{
    MemoryStream memout = new MemoryStream();
    using (CryptoStream crypto = new CryptoStream(memout, new DESCryptoServiceProvider().CreateEncryptor(new UTF8Encoding().GetBytes("87654321"), new UTF8Encoding().GetBytes("12345678")), CryptoStreamMode.Write))
    using (DeflateStream deflate = new DeflateStream(crypto, CompressionMode.Compress))
    using (MemoryStream memin = new MemoryStream(data))
    {
        memin.CopyTo(deflate);
    }

    return memout.ToArray();
}

Take into account that with the code above, the order of operations is that it first compresses, and then encrypts. I'm not clear if that is your intention.

If you wanted to encrypt first, and then compress, you would have to invert some lines in this way:

internal static byte[] Compress(byte[] data)
{
    MemoryStream memout = new MemoryStream();
    using (DeflateStream deflate = new DeflateStream(memout, CompressionMode.Compress))
    using (CryptoStream crypto = new CryptoStream(deflate, new DESCryptoServiceProvider().CreateEncryptor(new UTF8Encoding().GetBytes("87654321"), new UTF8Encoding().GetBytes("12345678")), CryptoStreamMode.Write))
    using (MemoryStream memin = new MemoryStream(data))
    {
        memin.CopyTo(crypto);
    }

    return memout.ToArray();
}
    
answered by 28.10.2017 в 15:23
0

The Write method returns no value:

//invalido Write no retorna 
    while ((numRead = stream.Write(buffer, 0, buffer.Length)) != 0) 

Try using the CopyTo(Stream) method to copy the content of the Stream to the variable memout :

    using (DeflateStream stream = new DeflateStream(crypto, CompressionMode.Compress)) { 
    stream.CopyTo(memout);
memout.Position = 0;
    }
    
answered by 28.10.2017 в 02:32