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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Persönlich würde ich
strings, damit du weißt, wie lange
Sie gehen zu sein, und
tun die das Lesen, es werde "Lesen", ints,
strings, chars usw. in variable z.B. BinReader.ReadInt16() liest zwei bytes zurück int16, die Sie repräsentieren, und bewegen Sie zwei bytes in den stream
Hoffe, das hilft.
P. S. seid vorsichtig mit der ReadString-Methode, übernimmt Sie die Zeichenfolge ist vorangestellt mit benutzerdefinierten 7-bit-Ganzzahlen, D. H., dass es geschrieben wurde von der BinaryWriter-Klasse.
Das folgende ist aus dieser CodeGuru post
Yah, der BinaryReader hat nicht funktioniert für uns, weil die Daten geschrieben, um den thread von einem Java-app. Ich landete mit "brute Force" durch das Lesen in das byte-array und dann fluchen über Sie, basierend auf unseren Daten-Paket-Struktur.
InformationsquelleAutor Binary Worrier
Ich würde mit Länge-Präfix-strings. Es wird Ihr Leben viel einfacher, und es bedeutet, Sie können strings mit Zeilenumbrüchen. Ein paar Kommentare zu deinem code aber:
InformationsquelleAutor Jon Skeet