2012-03-15 38 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 
相关问题