我有一个字节数组,我从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