3
[StructLayout(LayoutKind.Explicit)]
public struct struct1
{
    [FieldOffset(0)]
        public byte a;   // 1 byte
    [FieldOffset(1)]
        public int b;    // 4 bytes
    [FieldOffset(5)]
        public short c;  // 2 bytes
    [FieldOffset(7)]
        public byte buffer;
    [FieldOffset(18)]
        public byte[] shaHashResult;   // 20 bytes
}

void DoStuff()
{
   struct1 myTest = new struct1();
   myTest.shaHashResult =  sha256.ComputeHash(pkBytes);  // 20 bytes

   byte[] newParameter = myTest.ToArray() //<-- How do I convert a struct 
                                          //     to array without a copy?
}

myTest配列を取得して byte[] に変換するにはどうすればよいですか? オブジェクトが大きくなるので、配列をコピーしたくありません (memcopy など)。

4

1 に答える 1

0

あなたは大きな配列を持っているので、これはあなたが望むことをすることができる唯一の方法です:

var myBigArray = new Byte[100000];

// ...

var offset = 0;
var hash = sha256.ComputeHash(pkBytes);
Buffer.BlockCopy(myBigArray, offset, hash, 0, hash.Length);

// if you are in a loop, do something like this
offset += hash.Length;

このコードは非常に効率的で、タイトなループであっても、結果はComputeHashGen0 のクイック コレクションに収集されmyBigArrayますが、ラージ オブジェクト ヒープ上にあり、移動も収集もされません。はBuffer.BlockCopyランタイムで高度に最適化されており、ターゲットを固定し、展開されたポインター コピーを使用する場合でも、おそらく達成できる最速のコピーを生成します。

于 2012-12-17T23:21:06.580 に答える