NetworkStream是我在代码中不理解的东西

时间:2013-08-06 04:04:11

标签: c# optimization networkstream binaryreader

我在上一个关于如何发送图像的问题中得到了帮助。 完成的工作是首先发送图像的长度(大小),然后发送实际的图像,然后知道它何时完成。

IT看起来像这样:

BinaryWriter writer = new BinaryWriter(netStream);
while (someCondition) {
  Image img = SomeImage();
  MemoryStream ms = new MemoryStream();
  img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  byte[] buffer = new byte[ms.Length];
  ms.Seek(0, SeekOrigin.Begin);
  ms.Read(buffer, 0, buffer.Length);
  writer.Write(buffer.Length);
  writer.Write(buffer);

此代码来自:Angelo Geels,他在我之前的问题中帮助了我。

现在,我尝试以某种方式优化它。好吧,它有效。但只有当文件是bmp(未压缩)时,我才知道原因。

                    using (MemoryStream ms = PrintWindow(process))
                    {
                        writer.Write((int)ms.Length);
                        writer.Write(ms.GetBuffer());
                    }

所以PrintWindow将图像保存到内存流并返回它。所以ms =内存流,其中包含我的图像。

所以对我而言,这应该是完美的,因为我可以做同样的事情。

我发送文件的大小(内存流的长度)。 然后我在内存流中发送byte []数据。

所以,这是一回事。

但是,它只适用于bmp。

我唯一能想到的是,当我以压缩格式保存时,首先编写bmp然后进行编码,这会弄乱getbuffer()或其他东西。

但我仍然认为它应该有用。

2 个答案:

答案 0 :(得分:3)

你写了太多字节,使用Write()重载,你可以指定写入多少:

    using (MemoryStream ms = PrintWindow(process)) {
        writer.Write((int)ms.Length);
        writer.Write(ms.GetBuffer(), 0, (int)ms.Length);
    }

答案 1 :(得分:2)

不要使用GetBuffer。来自文档:

  

请注意,缓冲区包含可能未使用的已分配字节。   例如,如果字符串“test”被写入MemoryStream   对象,从GetBuffer返回的缓冲区的长度是256,而不是   4,未使用252字节。要仅获取缓冲区中的数据,请使用   ToArray方法;但是,ToArray会在其中创建数据的副本   存储器中。

使用:

 writer.Write(ms.ToArray());

或者如果你在4.0中使用CopyTo方法:

 ms.CopyTo(netStream);

如果您不在4.0中以复制流的方式,请检查此项: How do I copy the contents of one stream to another?