我有一个字节数组,我正在从 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);
}

最佳答案

我个人会

  • 在开头放一个 Int16
    字符串,所以你知道多长时间
    他们将会是,还有
  • 使用 IO.BinaryReader 类来
    做阅读,它会“阅读”,整数,
    字符串,字符等转换为变量,例如BinReader.ReadInt16() 将读取两个字节,返回它们代表的 int16,并在流
  • 中移动两个字节

    希望这可以帮助。

    附言小心使用 ReadString 方法,它假定字符串前面有自定义的 7 位整数,即它是由 BinaryWriter 类编写的。
    以下来自这个CodeGuru帖子

    关于c# - 从字节数组中读取行(不将字节数组转换为字符串),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/492454/

    10-17 02:45