How to remove data from a MemoryStream

穿精又带淫゛_ 提交于 2019-12-07 03:23:53

问题


I cannot get this to work. I have a MemoryStream object. This class has a Position property that tells you how many bytes you have read.

What I want to do is to delete all the bytes between 0 and Position-1

I tried this:

MemoryStream ms = ...
ms.SetLength(ms.Length - ms.Position);

but at some point my data gets corrupted.

So I ended up doing this

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);

which works but is not really efficient.

Any ideas how I can get this to work?

Thanks


回答1:


You can't delete data from a MemoryStream - the cleanest would be to create a new memory stream based on the data you want:

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



回答2:


This should work and be much more efficient than creating a new buffer:

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

MemoryStream.GetBuffer() gives you access to the existing buffer, so you can move bytes around without creating a new buffer.

Of course you'll need to be careful about out-of-bounds issues.




回答3:


Calling ms.SetLength(ms.Length - ms.Position) won't remove the bytes between 0 and ms.Position-1, in fact it will remove bytes between ms.Length - ms.Position and ms.Length.

Why not just write:

byte[] rest;
ms.Write(rest, ms.Length-ms.Position, rest.Length);



回答4:


 var _ = new MemoryStream();
 _.Write(buf.GetBuffer(), (int)buf.Position, (int)buf.Length - (int)buf.Position);
 buf = _;


来源:https://stackoverflow.com/questions/5733696/how-to-remove-data-from-a-memorystream

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!