2011-09-24 21 views
16

Tengo un algoritmo para encriptar y descifrar datos utilizando encriptación simétrica. de todos modos, cuando estoy a punto de descifrar, que tengo:La forma más eficiente de leer datos de una secuencia

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

tengo que leer los datos de la CS CryptoStream y colocar esos datos en una matriz de bytes. Así que 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 duración de la corriente CS:

enter image description here

O quizá debería implementar mi clase de pila Voy a la encriptación de una gran cantidad de información, por lo tanto haciendo de este código eficiente ahorrará mucho tiempo

Respuesta

42

Se podía 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 
} 
+0

gracias agradables que era exactamente lo que necesitaba! –

+0

pregunta rápida ... ¿por qué colocaste todo dentro de la instrucción using? ¿Qué significa la declaración de uso? –

+2

@Tono Nam, garantiza que el método Dispose de recursos IDisposable, como Streams, siempre se invoca para liberar todos los recursos no administrados que puedan tener, incluso en el caso de una excepción, y así evitar fugas de memoria en el código. Ese es un concepto fundamental sobre el que los invito a leer en MSDN: http://msdn.microsoft.com/en-us/library/yh598w02.aspx. También debe incluir su 'CryptoStream' en una sentencia using. –

25

Puesto que usted está almacenando todo en la memoria de todos modos sólo se puede utilizar un MemoryStream y CopyTo():

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

CopyTo() requerirá .NET 4

+0

la clase CryptoStream no contiene el método copyTo ... –

+0

@TonoNam: en .NET 4 'CopyTo()' se define en 'Stream' - todas las secuencias lo admiten, si su solución se dirige a una versión anterior de .NET sin duda utilizará @Darins solución – BrokenGlass

+0

No puedo creer que me perdí esta toda mi vida –

Cuestiones relacionadas