如何从MemoryStream中删除数据

LEM*_*LEM 6 .net c# memorystream

我不能让这个工作.我有一个MemoryStream对象.此类有一个Position属性,可以告诉您已读取的字节数.

我想要做的是删除0和位置1之间的所有字节

我试过这个:

MemoryStream ms = ...
ms.SetLength(ms.Length - ms.Position);
Run Code Online (Sandbox Code Playgroud)

但在某些时候我的数据被破坏了.

所以我最终做到了这一点

MemoryStream ms = ...
byte[] rest = new byte[ms.Length - ms.Position];
ms.Read(rest, 0, (int)(ms.Length - ms.Position));
ms.Dispose();
ms = new MemoryStream();
ms.Write(rest, 0, rest.Length);
Run Code Online (Sandbox Code Playgroud)

哪个有效,但效率不高.

任何想法我怎么能让这个工作?

谢谢

ese*_*elk 11

这应该工作并且比创建新缓冲区更有效:

byte[] buf = ms.GetBuffer();            
Buffer.BlockCopy(buf, numberOfBytesToRemove, buf, 0, (int)ms.Length - numberOfBytesToRemove);
ms.SetLength(ms.Length - numberOfBytesToRemove);
Run Code Online (Sandbox Code Playgroud)

MemoryStream.GetBuffer()允许您访问现有缓冲区,因此您可以在不创建新缓冲区的情况下移动字节.

当然,你需要小心越界问题.


Bro*_*ass 6

您无法从中删除数据MemoryStream- 最干净的是根据您想要的数据创建新的内存流:

MemoryStream ms = new MemoryStream(someData);
//ms.Position changes here
//...
byte[] data = ms.ToArray().Skip((int)ms.Position).ToArray();
ms = new MemoryStream(data);
Run Code Online (Sandbox Code Playgroud)


Set*_*ore 5

呼叫ms.SetLength(ms.Length - ms.Position)不会删除字节之间0ms.Position-1,事实上,它会之间删除字节ms.Length - ms.Positionms.Length.

为什么不写:

byte[] rest;
ms.Write(rest, ms.Length-ms.Position, rest.Length);
Run Code Online (Sandbox Code Playgroud)