2012-03-15 87 views
0

我有字節數組。我需要丟棄前4個字節,如下所示:如何在不分配新內存的情況下刪除部分數組?

byte[] newArray = new byte[byteArray.Length - 4]; 
Buffer.BlockCopy(byteArray, 4, newArray, 0, byteArray.Length - 4); 

但是,我可以只用C/C++風格移動指針嗎? :

byte[] byteMsg = byteArray + 4; 

我不想因爲相當經常執行該代碼,直到完全requried分配額外的內存。

UPD:我從套接字接收數據,所以我也許應該只使用另一版本的接收count = s.Receive(byteArray);

回答

4

不,你不能這樣做。 .NET數組的大小始終是固定的,您不能在不安全的代碼之外對其進行指針運算。

使用ArraySegment代替

+0

謝謝,我的數據來自'Socket.Receive',也許我只是應該使用重載方法的另一個版本,大概這一個http://msdn.microsoft.com/ru-ru/library/kw22c6h2。 ASPX – javapowered 2012-03-15 12:37:23

0

我不會擔心,GC將照顧清理你不再使用的前提是它沒有被引用的內存的嘗試。

C#中的數組是不可變的。你不能修改它們,所以如果你需要刪除前4個字節,那麼你將不得不重新分配。正如coop所建議的那樣,我會看看ArraySegment並使用它來傳遞給其他函數,如果這些前4個字節對您不重要。

同樣值得注意的是,在C++中,我們會使用一點指針算術,但是肯定會保留原始指針,減少我們最終取消分配並將4個字節丟到惡魔:)

0

只需保持Byte Array不變,並使用MemoryStream及其偏移功能。這不會改變你的數組,你可以跳過前n個字節。

var memoryStream = new MemoryStream(byteArray); 
// do whatever you want with the memory stream 
相關問題