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);