Наиболее эффективный способ чтения данных из потока
У меня есть алгоритм шифрования и дешифрования данных с использованием симметричного шифрования. в любом случае, когда я собираюсь расшифровать, у меня есть:
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]()
или, возможно, я должен реализовать класс стека. Я буду шифровать много информации, поэтому этот эффективный код сэкономит много времени
Ответы
Ответ 1
Вы можете читать куски:
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
}
Ответ 2
Так как вы все равно сохраняете все в памяти, вы можете просто использовать MemoryStream
и CopyTo()
:
using (MemoryStream ms = new MemoryStream())
{
cs.CopyTo(ms);
return ms.ToArray();
}
CopyTo()
потребуется .NET 4