2010-11-24 18 views
6

Estoy tratando de averiguar qué estoy haciendo mal aquí. Estoy intentando utilizar un lector binario para facilitar la obtención de cuatro bytes iniciales de una secuencia en un valor Int32 que me dice cuánto tiempo se esperará el resto de los datos.C# BinaryReader.Read() obtiene basura para comenzar con

static void Main(string[] args) 
{ 
    MemoryStream stream = new MemoryStream(); 

    BinaryWriter writer = new BinaryWriter(stream); 

    string s = "Imagine this is a very very long string."; 

    writer.Write(s.Length); 
    writer.Write(s); 
    writer.Flush(); 

    BinaryReader reader = new BinaryReader(stream); 
    reader.BaseStream.Seek(0, SeekOrigin.Begin); 

    char[] aChars = new char[reader.ReadInt32()]; 
    reader.Read(aChars, 0, aChars.Length); 
    Console.WriteLine(new string(aChars)); 
} 

La salida debe ser la entrada, pero me sale esto (Tenga en cuenta que los primeros cambios de carácter de la cadena es string)

(imagina que este es un muy, muy larga cadena

¿Puede alguien explicarme qué estoy haciendo mal? Lo ideal es que la segunda lectura continúe hasta que el total de bytes de lectura sea igual al valor de los primeros cuatro bytes ... este código es solo una simplificación para mostrar el problema que me estoy encontrando. La posición de la secuencia parece corr ect (4) pero parece que comienza a leer en 2.

+0

MSDN, quiere leerlo. – jason

+0

Hehe, gracias ... y lo estaba. Desafortunadamente para mí, el BinaryReader no menciona que Writer almacena datos adicionales para una cadena que la cadena;) – James

+0

'BinaryWriter.Write (cadena)': "Una cadena con el prefijo de longitud' representa la longitud de la 'cadena' prefijando a' string' un solo byte o palabra que contiene la longitud de esa 'cadena'. Este método primero escribe la longitud de la' cadena' como un entero sin signo codificado en UTF-7, y luego escribe esa cantidad de caracteres en la secuencia mediante el ' La codificación actual de la instancia de BinaryWriter' ". – jason

Respuesta

8

BinaryWriter.Write(String) escribe una cadena con prefijo de longitud en esta secuencia. Esto significa que primero escribe la longitud de la cadena en la secuencia, y luego la cadena usando alguna codificación. La longitud se codifica siete bits a la vez, no como un entero de 32 bits.

Si desea leer la secuencia, debe usar BinaryReader.ReadString, que lee una cadena con prefijo de longitud de la secuencia.

+0

¿Esperará automáticamente a que aparezca el resto de los datos si no los tiene inicialmente en la transmisión? – James

+0

No solo escribe la longitud primero, sino que la longitud se escribe en una codificación de 7 bits. Entonces, las cadenas que tienen menos de 128 bytes de longitud tienen un prefijo de longitud de un byte, etc. –

+0

@James: Sí, esperará los datos. –

Cuestiones relacionadas