C# 如何**写入**以进行排列<;字节>;。阵列?我应该使用不安全的代码吗?

C# 如何**写入**以进行排列<;字节>;。阵列?我应该使用不安全的代码吗?,c#,arrays,bytearray,unsafe,C#,Arrays,Bytearray,Unsafe,有许多问题询问如何在这个站点上获取数组的子集,但是没有人成功地得到关于如何将数组当作byte[]写入数组的答案 byte[] bigTargetBytes = new byte[10000]; byte[] twentyBytes = sha256.ComputeHash(sourcebytes); // size is 20 bytes, // how do I append this to the existing array without copying, using Linq,

有许多问题询问如何在这个站点上获取数组的子集,但是没有人成功地得到关于如何将数组当作
byte[]
写入数组的答案

byte[] bigTargetBytes = new byte[10000];

byte[] twentyBytes = sha256.ComputeHash(sourcebytes);  // size is 20 bytes, 
// how do I append this to the existing array without copying, using Linq, etc?

我不想做的是有两个数组并在它们之间进行复制,因为这是一个时间密集型的过程,与数组的长度成正比(我的数组很长)

恐怕您必须以任何方式进行复制。我建议您使用
Buffer.BlockCopy()
方法,这是最快的。

恐怕您必须以任何一种方式进行复制。我建议您使用
Buffer.BlockCopy()
方法,这是最快的方法。

您想要什么还不清楚,但我猜您想要一个字节数组的“视图”。在.Net 4.5中,您可以使用
ArraySegment

尽管在.Net中,由于内存是托管运行时,所以对内存分配有特定的限制,但这在任何编程语言中都是常见的模式。在C/C++开发中,使用了一种协议,在这种协议中,要么传入一个带有偏移量和maxlength的预分配数组进行写入,要么允许函数返回一个分配的内存,然后让您负责释放该内存(除非从框架中回调)。不能只将值返回到现有缓冲区中


但是请注意,仅从
ComputeHash
值分配的GC数组中复制20个字节是一个非常简单的操作,运行时可以非常有效地处理该操作。除非您对微秒级的暂停非常敏感,否则您不会注意到实际拷贝和假设实现之间的差异。

不清楚您想要什么,但我猜您想要一个字节数组的“视图”。在.Net 4.5中,您可以使用
ArraySegment

尽管在.Net中,由于内存是托管运行时,所以对内存分配有特定的限制,但这在任何编程语言中都是常见的模式。在C/C++开发中,使用了一种协议,在这种协议中,要么传入一个带有偏移量和maxlength的预分配数组进行写入,要么允许函数返回一个分配的内存,然后让您负责释放该内存(除非从框架中回调)。不能只将值返回到现有缓冲区中


但是请注意,仅从
ComputeHash
值分配的GC数组中复制20个字节是一个非常简单的操作,运行时可以非常有效地处理该操作。除非您对不时出现的微秒级暂停非常敏感,否则您不会注意到实际副本与假设实现之间的差异。

我实际上想写入ArraySegment.Arrayth此示例显示了这一点。请注意
a[9]
的值,它是原始数组。我正在使用
sha256.ComputeHash
并希望将其调用附加到现有数据中。然后必须传入数组。你可以传入一个
ArraySegment
,这样你就不必传入偏移量了。我想如果我把我的数据看作是几个字节[]的结构,然后将结构转换成一个大字节[],我可以做我需要做的事情。你怎么认为?实际上我想写ArraySegment.arrayth这个例子说明了这一点。请注意
a[9]
的值,它是原始数组。我正在使用
sha256.ComputeHash
并希望将其调用附加到现有数据中。然后必须传入数组。你可以传入一个
ArraySegment
,这样你就不必传入偏移量了。我想如果我把我的数据看作是几个字节[]的结构,然后将结构转换成一个大字节[],我可以做我需要做的事情。你怎么认为?
var a = new byte[100];
var s = new ArraySegment<Byte>(a, 9, 90);

((IList<Byte>)s)[0] = 10;
Console.WriteLine(a[9]);  // writes "10"
// previously defined...
byte[] bigTargetBytes = new byte[10000];      

// This method doesn't really exist, but if it did it would look like this
sha256.ComputeHash(sourcebytes, bigTargetBytes, offset);