我有一个从 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
我知道(并且有一些发言权)正在遇到的数据包的格式,我需要做的是为每个字符串值读取一个“行”,但为字节和 long 读取固定数量的字节。到目前为止,我提出的解决方案是使用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);
}