我有一個字節數組,我從NetworkStream中讀取數據。前兩個字節表示隨後的數據包的長度,然後將數據包讀入該長度的字節數組中。我需要從NetworkStream/byte數組中讀取的數據有幾個字符串,即可變長度數據以新行字符結尾,以及一些固定寬度的字段,如字節和長整型。所以,這樣的事情:從字節數組讀取行(不將字節數組轉換爲字符串)
// I would have delimited these for clarity but I didn't want
// to imply that the stream was delimited because it's not.
StringbyteStringStringbytebytebytelonglongbytelonglong
我知道(並有一定的說,在),其跨來的數據包的格式,我需要做的是閱讀每個字符串值「線」是什麼,但讀取字節和長整數的字節數。到目前爲止,我提出的解決方案是使用while
循環將字節讀入臨時字節數組,直到出現換行符爲止。然後,將字節轉換爲字符串。這對我來說似乎很笨拙,但我沒有看到另一種明顯的方式。我意識到我可以使用StreamReader.ReadLine()
,但這將涉及另一個流,我已經有一個NetworkStream
。但如果這是更好的解決方案,我會給它一個機會。
我考慮的另一個選擇是讓我的後端團隊爲這些字符串值的長度寫入一個或兩個字節,以便我可以讀取長度,然後根據指定的長度讀取字符串。因此,正如你所看到的,我有一些關於如何解決這個問題的選擇,並且我希望你對你認爲最好的方式提出意見。以下是我現在用於讀取整個數據包的字符串的代碼。下一步是打破數據包的各個領域,根據數據包中的數據完成需要完成的實際編程工作,創建對象,更新UI等。
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);
}
以前沒有遇到過BinaryReader。這看起來對於我正在處理的所有這些東西都是非常有幫助的。謝謝! – jxpx777 2009-01-29 17:09:07