Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove data from a MemoryStream

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

like image 666
LEM Avatar asked Apr 20 '11 16:04

LEM


1 Answers

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.

like image 155
eselk Avatar answered Sep 23 '22 23:09

eselk