Liest eine Zeile aus byte-array (nicht umwandeln byte-array in string)

Ich habe ein byte-array, das lese ich aus einem NetworkStream. Die ersten zwei bytes geben die Länge des Pakets, die folgt, und dann wird das Paket gelesen wird in ein byte-array der Länge. Die Daten, die ich brauche zum Lesen aus dem NetworkStream - /byte-array hat ein paar Strings, d.h. die Daten variabler Länge beendet durch neue-Zeile-Zeichen, und einige Feste Breite-Felder wie Byte, und sehnt sich danach. Also, so etwas wie dieses:

//I would have delimited these for clarity but I didn't want
//to imply that the stream was delimited because it's not.
StringbyteStringStringbytebytebytelonglongbytelonglong

Weiß ich (und einige sagen) das format der Datenpakete, die herüber kommen, und was ich tun müssen, ist Lesen eine "Linie" für jeden string-Wert, aber Lesen Sie eine Feste Anzahl von bytes für die Byte-und Long. So weit, meine vorgeschlagene Lösung ist die Verwendung eines while Schleife zum Lesen von bytes in eine temp-byte-array, bis es ein neue-Zeile-Zeichen. Anschließend konvertieren Sie die bytes in einen string. Dies scheint notdürftigem zu mir, aber ich sehen keine andere offensichtliche Möglichkeit. Ich merke, ich könnte verwenden StreamReader.ReadLine() aber das würde bedeuten, anderen Strom, und ich habe bereits eine NetworkStream. Wenn das aber die bessere Lösung, ich werde give it a shot.

Die andere Möglichkeit, die ich betrachtet haben, ist meine backend-team schreiben ein byte oder zwei für diejenigen, die String-Werte " Längen, so kann ich Lesen Sie die Länge und Lesen Sie dann die Zeichenfolge auf der Grundlage der angegebenen Länge.

So, wie Sie sehen können, habe ich einige Optionen für, wie man über diese, und ich möchte Ihre Eingabe über das, was Sie denken würden, dass der beste Weg, es zu tun. Hier ist der code, habe ich jetzt für das Lesen in das gesamte Paket als string. Der nächste Schritt ist, zu durchbrechen und die verschiedenen Felder der Paket-und machen die eigentliche Programmierung der Arbeit, die getan werden muss, erstellen von Objekten, die Aktualisierung der Benutzeroberfläche, etc. basierend auf den Daten in dem Paket.

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);
}

InformationsquelleAutor jxpx777 | 2009-01-29

Schreibe einen Kommentar