在.NET中将Stream(未知长度)转换为字节数组的最佳方法?

时间:2010-06-18 12:20:47

标签: c# .net stream bytearray named-pipes

我有以下代码从Stream(在这种情况下,从命名管道)读取数据并转换为字节数组:

// NPSS is an instance of NamedPipeServerStream

int BytesRead;
byte[] StreamBuffer = new byte[BUFFER_SIZE]; // size defined elsewhere (less than total possible message size, though)
MemoryStream MessageStream = new MemoryStream();

do
{
    BytesRead = NPSS.Read(StreamBuffer, 0, StreamBuffer.Length);
    MessageStream.Write(StreamBuffer, 0, BytesRead);
} while (!NPSS.IsMessageComplete);

byte[] Message = MessageStream.ToArray(); // final data

您能否请一看,让我知道它是否可以更有效或更整洁地完成?使用MemoryStream看起来有点乱。谢谢!

3 个答案:

答案 0 :(得分:21)

Jon Skeet's article无耻地复制。

public static byte[] ReadFully (Stream stream)
{
   byte[] buffer = new byte[32768];
   using (MemoryStream ms = new MemoryStream())
   {
       while (true)
       {
           int read = stream.Read (buffer, 0, buffer.Length);
           if (read <= 0)
               return ms.ToArray();
           ms.Write (buffer, 0, read);
       }
   }
}

答案 1 :(得分:3)

int read = stream.Read (buffer, 0, buffer.Length);

如果没有可用数据,此行将永久阻止。 Read是一个阻塞函数,它会阻塞线程,直到它读取至少一个字节,但如果没有数据,那么它将永远阻塞。

答案 2 :(得分:1)

看起来你当前的解决方案非常好。如果您希望代码看起来更清晰,可以考虑将其包装到扩展方法中。