c# performance stream

c# - La forma más eficiente de leer datos de un flujo



performance stream (2)

Tengo un algoritmo para cifrar y descifrar datos utilizando el cifrado simétrico. De todos modos cuando estoy a punto de descifrar, tengo:

CryptoStream cs = new CryptoStream(ms, cryptoTransform, CryptoStreamMode.Read);

Tengo que leer datos de cs CryptoStream y colocar esos datos en una matriz de bytes. Entonces, un método podría ser:

System.Collections.Generic.List<byte> myListOfBytes = new System.Collections.Generic.List<byte>(); while (true) { int nextByte = cs.ReadByte(); if (nextByte == -1) break; myListOfBytes.Add((Byte)nextByte); } return myListOfBytes.ToArray();

Otra técnica podría ser:

ArrayList chuncks = new ArrayList(); byte[] tempContainer = new byte[1048576]; int tempBytes = 0; while (tempBytes < 1048576) { tempBytes = cs.Read(tempContainer, 0, tempContainer.Length); //tempBytes is the number of bytes read from cs stream. those bytes are placed // on the tempContainer array chuncks.Add(tempContainer); } // later do a for each loop on chunks and add those bytes

No puedo saber de antemano la longitud del flujo cs:

o tal vez debería implementar mi clase de pila. Estaré cifrando mucha información, por lo tanto, hacer que este código sea eficiente ahorrará mucho tiempo.


Podrías leer en trozos:

using (var stream = new MemoryStream()) { byte[] buffer = new byte[2048]; // read in chunks of 2KB int bytesRead; while((bytesRead = cs.Read(buffer, 0, buffer.Length)) > 0) { stream.Write(buffer, 0, bytesRead); } byte[] result = stream.ToArray(); // TODO: do something with the result }


Ya que estás almacenando todo en la memoria, puedes usar MemoryStream y CopyTo() :

using (MemoryStream ms = new MemoryStream()) { cs.CopyTo(ms); return ms.ToArray(); }

CopyTo() requerirá .NET 4