2011-04-20 114 views
4

我不能得到這個工作。我有一個MemoryStream對象。這個類 有一個Position屬性,告訴你讀了多少個字節。如何從MemoryStream中刪除數據

我想要做的就是刪除0到1之間的所有字節位置-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); 

其作品,但不是真正有效。

任何想法,我可以得到這個工作?

感謝

+0

幫我,謝謝 – Tarion 2012-03-29 07:29:06

回答

5

你不能從一個MemoryStream刪除數據 - 最乾淨的將是基於數據創建一個新的內存流你想要的:

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

你確定嗎?那麼SetLength做了什麼?謝謝 – LEM 2011-04-20 17:38:03

+0

@Moonlit - 你可以*截斷數據,但不能刪除任意塊,你需要以某種方式複製數據。話雖如此,我的代碼並不比你的更好(除了你依靠'ms.Read()'來複制所有字節) – BrokenGlass 2011-04-20 17:46:01

+0

我現在明白了。謝謝! – LEM 2011-04-20 17:58:26

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

感謝關於SetLength方法的解釋 – LEM 2011-04-20 17:57:50

4

這應該工作,並且比創建新緩衝區更有效:

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

MemoryStart ream.GetBuffer()使您可以訪問現有的緩衝區,因此您可以在不創建新緩衝區的情況下移動字節。

當然,您需要小心超出界限的問題。

0
​​3210