2012-03-15 4 views
0

私はバイト配列を持っています。どのようにalloci新しいメモリを使用せずに配列の一部を削除するには?

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

C/C++スタイルでポインタを移動するだけでいいですか? :

byte[] byteMsg = byteArray + 4; 

このコードはかなり頻繁に実行されるため、余分なメモリを割り当てる必要はありません。

UPD:私はので、私はおそらくちょうどいいえ、あなたはそれを行うことはできません受信count = s.Receive(byteArray);

答えて

4

の別のバージョンを使用する必要がありますソケットからデータを受け取ります。 .NET配列は常に固定サイズであり、安全でないコードの外側でポインタ演算を行うことはできません。

ではなく

+0

おかげで、私のデータは 'Socket.Receive'、おそらく私はこの1つだけhttp://msdn.microsoft.com/ru-ru/library/kw22c6h2おそらく、オーバーロードされたメソッドの別のバージョンを使用する必要がありますから来ています。 aspx – javapowered

0

ArraySegmentを使用してみてください私は、GCは、あなたは、もはやそれが参照されていない提供使用しているメモリのクリーンアップを行いますが、心配しないでしょう。

C#の配列は不変です。それらを変更することはできませんので、最初の4バイトを削除する必要がある場合は、再割り当てする必要があります。クールが示唆するように、私はArraySegmentを見て、これらの最初の4バイトがあなたにとって重要でないなら、それを他の関数に渡すために使用します。

C++では、ポインタの算術演算を少し使用していましたが、元のポインタを保持して、割り当てが解除され、悪魔に4バイトが失われることはありません:)

0

Byte Arrayをそのままにしておき、MemoryStreamを使用すると、オフセット機能が使用できます。これにより配列が変更されることはなく、最初のnバイトをスキップすることができます。

var memoryStream = new MemoryStream(byteArray); 
// do whatever you want with the memory stream 
関連する問題