Как удалить данные из MemoryStream - PullRequest
6 голосов
/ 20 апреля 2011

Я не могу заставить это работать. У меня есть объект MemoryStream. Этот класс имеет свойство Position, которое сообщает вам, сколько байтов вы прочитали.

Что я хочу сделать, это удалить все байты между 0 и Position-1

Я пробовал это:

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

но в какой-то момент мои данные повреждены.

Так что я закончил этим

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

, который работает, но не очень эффективен.

Есть идеи, как мне заставить это работать?

Спасибо

Ответы [ 4 ]

10 голосов
/ 10 мая 2013

Это должно работать и быть гораздо более эффективным, чем создание нового буфера:

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

MemoryStream.GetBuffer () предоставляет вам доступ к существующему буферу, поэтому вы можете перемещать байты без создания нового буфера.

Конечно, вы должны быть осторожны с проблемами, выходящими за границы.

6 голосов
/ 20 апреля 2011

Вы не можете удалить данные из MemoryStream - самое чистое - создать новый поток памяти на основе данных, которые вы хотите:

MemoryStream ms = new MemoryStream(someData);
//ms.Position changes here
//...
byte[] data = ms.ToArray().Skip((int)ms.Position).ToArray();
ms = new MemoryStream(data);
5 голосов
/ 20 апреля 2011

Вызов ms.SetLength(ms.Length - ms.Position) не удалит байты между 0 и ms.Position-1, фактически он удалит байты между ms.Length - ms.Position и ms.Length.

Почему бы просто не написать:

byte[] rest;
ms.Write(rest, ms.Length-ms.Position, rest.Length);
0 голосов
/ 13 января 2014
 var _ = new MemoryStream();
 _.Write(buf.GetBuffer(), (int)buf.Position, (int)buf.Length - (int)buf.Position);
 buf = _;
...