Tengo una matriz de bytes que estoy leyendo desde un NetworkStream. Los primeros dos bytes indican la longitud del paquete que sigue y luego el paquete se lee en una matriz de bytes de esa longitud. Los datos que necesito leer de la matriz NetworkStream/byte tienen algunas cadenas, es decir, datos de longitud variable terminados por nuevos caracteres de línea, y algunos campos de ancho fijo como bytes y longs. Por lo tanto, algo como esto:Leer línea de matriz de bytes (no convertir matriz de bytes a cadena)
// I would have delimited these for clarity but I didn't want
// to imply that the stream was delimited because it's not.
StringbyteStringStringbytebytebytelonglongbytelonglong
que conozco (y tienen algo que decir en) el formato del paquete de datos que está llegando a través, y lo que tengo que hacer es leer una "línea" para cada valor de cadena, pero lea un número fijo de bytes para los bytes y longs. Hasta ahora, mi solución propuesta es usar un bucle while
para leer bytes en una matriz de bytes temporales hasta que haya un carácter de nueva línea. Luego, convierta los bytes a una cadena. Esto me parece kludgy, pero no veo otra manera obvia. Me doy cuenta de que podría usar StreamReader.ReadLine()
, pero eso implicaría otra transmisión y ya tengo un NetworkStream
. Pero si esa es la mejor solución, lo intentaré.
La otra opción que he considerado es hacer que mi equipo de backend escriba un byte o dos para esas longitudes de los valores de cadena para que pueda leer la longitud y luego leer la cadena en función de la longitud especificada.
Por lo tanto, como puede ver, tengo algunas opciones sobre cómo hacer esto, y me gustaría su opinión sobre lo que consideraría la mejor manera de hacerlo. Aquí está el código que tengo ahora para leer todo el paquete como una cadena. El siguiente paso es dividir los diversos campos del paquete y hacer el trabajo de programación real que se necesita hacer, crear objetos, actualizar la interfaz de usuario, etc. en función de los datos del paquete.
string line = null;
while (stream.DataAvailable)
{
//Get the packet length;
UInt16 packetLength = 0;
header = new byte[2];
stream.Read(header, 0, 2);
// Need to reverse the header array for BitConverter class if architecture is little endian.
if (BitConverter.IsLittleEndian)
Array.Reverse(header);
packetLength = BitConverter.ToUInt16(header,0);
buffer = new byte[packetLength];
stream.Read(buffer, 0, BitConverter.ToUInt16(header, 0));
line = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
Console.WriteLine(line);
}
No había encontrado BinaryReader antes. Parece que será inmensamente útil para todas estas cosas en las que estoy trabajando. ¡Gracias! – jxpx777
Yah, el BinaryReader no funcionó para nosotros porque una aplicación Java está escribiendo los datos en el hilo. Terminé "forzándolo en bruto" leyendo en la matriz de bytes y luego maldiciéndolo en base a nuestra estructura de paquetes de datos. – jxpx777