[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
转换为字节[]? 由于我的对象会很大,我不想复制数组(内存拷贝等)
由于您有一个大数组,因此这确实是您能够执行所需操作的唯一方法:
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
在运行时进行了高度优化,即使在固定目标和使用展开的指针副本时,也能生成您可能实现的最快副本。