7

最大サイズ 1K のバイト配列バッファがあります。配列のサブセットを書き出す必要があります (サブセットの開始は常に要素 0 になりますが、関心のある長さは変数にあります)。

ここでのアプリケーションは圧縮です。バッファを圧縮関数に渡します。簡単にするために、圧縮によって 1K バイト以下のデータになると仮定します。

byte[] buffer = new byte[1024];
while (true)
{
    uncompressedData = GetNextUncompressedBlock();
    int compressedLength = compress(buffer, uncompressedData);

    // Here, compressedBuffer[0..compressedLength - 1] is what we're interested in

    // There's a method now with signature Write(byte[] compressedData) that
    // I won't be able to change. Short of allocating a custom sized buffer,
    // and copying data into the custom sized buffer... is there any other
    // technique I could use to only expose the data I want?
}

ここでのコピーは避けたいと思います。必要なデータはすべてbuffer既に含まれているため、完全に不要に思えます。

4

5 に答える 5

12

Buffer.BlockCopyが私の選択です。

Microsoftの例: http: //msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx

const int INT_SIZE = 4;
int[] arr = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
Buffer.BlockCopy(arr, 3 * INT_SIZE, arr, 0 * INT_SIZE, 4 * INT_SIZE);
foreach (int value in arr)
   Console.Write("{0}  ", value);
// The example displays the following output:
//       8  10  12  14  10  12  14  16  18  20 

コードは次のようになります。

uncompressedData = GetNextUncompressedBlock();      
int compressedLength = compress(buffer, uncompressedData);
Buffer.BlockCopy(buffer, 0, buffer, 0, compressedLength);
于 2012-05-10T18:08:17.947 に答える
6

メソッドのシグネチャを変更できない場合は、行き詰まっています。byte[]型のバイト配列に対して「ビュー」を作成することはできません。そのための理想的な解決策は、操作がArraySegment<byte>またはのbyte[]後にオフセットとカウントを取得することです。本当にWriteメソッドを変更できない場合は、残念ながら、新しい配列を作成してデータをその配列にコピーすることに固執しています。

于 2012-05-10T18:01:30.727 に答える
6
    byte[] b = new Byte[] {1, 2, 3, 4, 5};
    IEnumerable<Byte> middle = b.Skip(2).Take(3);

これにより、好きな中間セクションを取得できます。これによりコピーが作成される可能性が最も高いですが、それを回避しようとする必要はないと思います。

于 2012-05-10T18:23:37.760 に答える
3

あなたがそれをすることができる方法はありません。Array.Resizeは、配列の長さを変更する代わりに、新しい配列インスタンスにコピーするだけです。

ただし、パフォーマンスが向上したBufferクラスを使用できます。

Bufferは、プリミティブ型の1つの配列からプリミティブ型の別の配列にバイトをコピーし、配列からバイトを取得し、配列にバイトを設定し、配列の長さを取得するメソッドを提供します。このクラスは、System.Arrayクラスの同様のメソッドよりも、プリミティブ型を操作するためのパフォーマンスが向上します。

バイトの配列があり、バイトはプリミティブ型であるため、これはニーズに一致します。

于 2012-05-10T18:08:35.463 に答える
2

メソッドシグネチャの場合(byte[])、コピー以外のことはできません。

署名を変更できる場合:

于 2012-05-10T18:02:30.680 に答える