Hola a todos!
Los MemoryStream son una herramienta muy útil para ir construyendo un buffer en memoria, sobre todo cuando a priori no se sabe el tamaño que va a tener. Esta clase se utiliza como un Stream normal, de manera que puedes ir leyendo o escribiendo los datos que necesites. Además, te gestiona automáticamente el tamaño del buffer de memoria subyacente, de manera que no tengas que preocuparte de ir redimensionando el buffer si se te queda corto.
Sin embargo, si lo que necesitas no es un churro de bytes un buffer que contenga únicamente bytes, sino que quieres darlos un significado a posteriori (como por ejemplo, necesitas extraer unas cadenas de texto), y lo quieres obtener después de haber escrito los contenidos de ese MemoryStream poco a poco (por ejemplo, porque lo estás leyendo de otro Stream del que no conoces el tamaño inicialmente), hay que tener en cuenta un detalle importante:
Cuando obtengas el buffer subyacente del MemoryStream (es decir, llames al método GetBuffer), dicho buffer tendrá el tamaño total de lo que ha reservado automáticamente el MemoryStream.
¿Qué narices quiere decir eso? Pues básicamente, que si has escrito en el Stream un total de x bytes, y llamas al método GetBuffer, no obtendrás un buffer con esos x bytes que has escrito (a no ser que tengas mucha suerte), sino del tamaño que tenga reservado en ese momento el stream.
El método correcto al que debes llamar es ToArray(), que te devolverá un array de bytes. Si luego debes transformar dicho array, ten presente el encoding que utilice tu fuente de datos.
Bueno, pues nada más por hoy… Un saludo!
Totalmente cierto lo que dices, pero si lo que querías era sólo una copia de los datos del stream el metodo ToArray te devuelve ya una copia de la longitud exacta:
http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray(VS.80).aspx
Saludos!
¡Totalmente cierto!
Muchas gracias 😉