Самый эффективный способ чтения данных из потока - PullRequest
23 голосов
/ 25 сентября 2011

У меня есть алгоритм для шифрования и дешифрования данных с использованием симметричного шифрования.В любом случае, когда я собираюсь расшифровать, у меня есть:

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

Я должен прочитать данные из CS CryptoStream и поместить эти данные в массив байтов.Таким образом, один метод может быть:

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

другой метод может быть:

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

Я не могу заранее знать длину потока cs:

enter image description here

или, возможно, я должен реализовать свой класс стека.Я буду зашифровывать много информации, поэтому эффективное использование этого кода сэкономит много времени

Ответы [ 2 ]

52 голосов
/ 25 сентября 2011

Вы можете прочитать кусками:

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
}
31 голосов
/ 25 сентября 2011

Поскольку вы все равно храните в памяти, вы можете просто использовать MemoryStream и CopyTo():

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

CopyTo()..NET 4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...