2012-07-29 14 views
5

Estoy leyendo cadenas desde un archivo binario. Cada cadena tiene un final nulo. La codificación es UTF-8. En Python, simplemente leo un byte, compruebo si es 0, lo anexo a una matriz de bytes y continúo leyendo bytes hasta que veo un 0. Luego, convierto una matriz de bytes en una cadena y sigo adelante. Todas las cadenas fueron leídas correctamente.Lectura de una cadena terminada en nulo

¿Cómo puedo leer esto en C#? No creo que tenga el lujo de simplemente agregar bytes a una matriz, ya que las matrices son de tamaño fijo.

+1

Por qué no utilizar una lista ? –

+0

¿Por qué no solo los agrega a una cadena como caracteres? – zellio

+0

Esto funcionaría, pero usará más memoria de la que pensaría. Las cadenas de C# son inmutables, por lo que cada vez que modifique una, se debe crear una nueva. La cantidad de memoria adicional probablemente no sea un problema en la mayoría de los casos, pero la mejor manera es probablemente la sugerencia de Mike, con un tamaño inicial razonable. La lista sigue siendo un envoltorio alrededor de una matriz, que crea matrices más grandes cuando es necesario. – TheEvilPenguin

Respuesta

4

También se puede usar un List<byte>:

List<byte> list = new List<byte>(); 
while(reading){ //or whatever your condition is 
    list.add(readByte); 
} 

string output = Encoding.UTF8.GetString(list.ToArray()); 

o puede utilizar un StringBuilder:

StringBuilder builder = new StringBuilder(); 

while(reading){ 
    builder.Append(readByte); 
} 

string output = builder.ToString(); 
+3

-1: StringBuilder no [agregará] (http://msdn.microsoft.com/en-us/library/86yy043k.aspx) el valor del carácter del byte, sino el valor entero del byte en su lugar. – Virtlink

6

siguiente debe conseguir lo que busca. Todo el texto debe estar dentro de mi lista de Texto.

var data = File.ReadAllBytes("myfile.bin"); 
List<string> myText = new List<string>(); 
int lastOffset = 0; 
for (int i = 0; i < data.Length; i++) 
{ 
    if (data[i] == 0) 
    { 
     myText.Add(System.Text.Encoding.UTF8.GetString(data, lastOffset, i - lastOffset)); 
     lastOffset = i + 1; 
    } 
} 
+0

Esta debería ser la respuesta –

3

que asumen que está utilizando una instancia StreamReader:

StringBuilder sb = new StringBuilder(); 
using(StreamReader rdr = OpenReader(...)) { 
    Int32 nc; 
    while((nc = rdr.Read()) != -1) { 
      Char c = (Char)nc; 
      if(c != '\0') sb.Append(c); 
    } 
} 
Cuestiones relacionadas