web-dev-qa-db-fra.com

Le moyen le plus efficace de lire les données d'un flux

J'ai un algorithme pour crypter et décrypter les données en utilisant le cryptage symétrique. de toute façon quand je suis sur le point de décrypter, j'ai:

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

Je dois lire les données du cs CryptoStream et placer ces données dans un tableau d'octets. Une méthode pourrait donc être:

  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();

une autre technique pourrait être:

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

Je ne peux pas savoir à l'avance la longueur du flux cs:

enter image description here

ou peut-être devrais-je implémenter ma classe de pile. Je vais crypter beaucoup d'informations donc rendre ce code efficace vous fera gagner beaucoup de temps

24
Tono Nam

Vous pouvez lire en morceaux:

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
}
53
Darin Dimitrov

Comme vous stockez tout dans la mémoire de toute façon, vous pouvez simplement utiliser un MemoryStream et CopyTo() :

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

CopyTo() nécessitera .NET 4

31
BrokenGlass