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