如何在没有副本的情况下将结构转换为字节数组?

时间:2012-12-17 22:34:20

标签: c# arrays struct bytearray unsafe

[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等)

1 个答案:

答案 0 :(得分: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;

此代码非常高效,即使在紧密循环中,ComputeHash的结果也会收集在快速Gen0集合中,而myBigArray将在大对象堆上,而不会被移动或收集。 Buffer.BlockCopy在运行时进行了高度优化,即使在固定目标和使用展开的指针副本的情况下,也可以获得最快的副本。