c# memoryStream 与 udp传输

来源:百度知道 编辑:UC知道 时间:2024/05/29 22:40:03
摄像头采集 --》 图片传输 --》远程端接受

接收端:
ms = new MemoryStream();
receives = udpClient.Receive(ref ipEndPoint);
Console.WriteLine("get size is " + receives.Length);
ms.Write(receives, 0, receives.Length);
pictureBox1.Image = Image.FromStream(ms);
发送端:
this.current_Image.Save(memoryStream, GetCodecInfo("image/jpeg"), ps);
int length = (int)memoryStream.Length;
memoryStream.Read(arrImage,0,length);
//用到 arrImage = memoryStream.GetBuffer()则接受正常
udpClient.Send(arrImage, length);

问题是 :memoryStream.Read(arrImage,0,length); 与arrImage = memoryStream.GetBuffer()区别在哪? 而且两者貌似之后arrImage的大小也不同。
如用memoryStream.Read(arrImage,0,length); 导致接受端 pictureBox1.Image = Image.FromStream(ms);
参数异常。

GetBuffer 方法是获取内存的取缓冲区数据(字节数组)。

你的问题我仔细看了一下“发送端“代码”,是出在这里:

this.current_Image.Save(memoryStream, GetCodecInfo("image/jpeg"), ps);
// 这一行代码,将图片数据写入了流,但是流的当前位置会因为写入数据而发生了改变(在流的末端)。
// 假设你的图片是 1024 byte 大小,那么调用 Save 方法后,流的当前位置就在 1024 字节之后的位置。

memoryStream.Read(arrImage,0,length);
// 这一行代码,其实是从 1024 字节之后开始读取的(因为流的当前位置在 1024 字节之后。此处假设前面的代码写入了 1024 byte 图像数据),而 1024 字节之后没有任何东东所以读取不到任何数据 。
// 解决办法:请在调用 memoryStream.Read 方法之前重设流的当前位置,更正后代码如下::
this.current_Image.Save(memoryStream, GetCodecInfo("image/jpeg"), ps);
int length = (int)memoryStream.Length;
// ***** 此处加一行代码 ****/
memoryStream.Position = 0; // 将流的位置重设为起始位置
// *************************/
memoryStream.Read(arrImage,0,length);
//用到 arrImage = memoryStream.GetBuffer()则接受正常
udpClient.Send(arrImage, length);

最后:
// 使用这一行代码不出错,是因为该方法直接获取流的缓冲区,和流的当前位置无关所以不出错。
memoryStream.GetBuffer()