繁体   English   中英

使用C#在特定位置将一个字节数组插入另一个字节数组

[英]Insert a byte array into another byte array at a specific position with c#

这可能是一个愚蠢的问题,但尚未找到简单的答案...

我正在尝试在特定位置的另一个字节数组中插入一个简单的c#字节数组。 例如,现有字节不应被覆盖,而应移回更远的位置。 就像您将页面复制到现有文本块内的某些文本块一样。

  1. 到目前为止,我将创建一个具有两个现有数组长度的新数组。
  2. 将第一个数组复制到新数组中,直到插入开始的位置。
  3. 添加插入的数组
  4. 添加现有阵列的其余部分。

但是我认为这是普遍现象,应该更容易吗? 还是我错了?

但我认为这是普遍现象

如果您经常要在另一块大数据的中间插入一大块数据,那么您可能会考虑使用设计用于执行此操作的数据结构。 数组被设计为大小固定内容可变 如果您的要求包括“大小可变”,那么数组对您来说是错误的数据类型。 而是考虑使用双向链表或可链接的双端队列。

并且应该更容易?

您已经确定了可以执行所需操作的简单四步算法。 没有比这容易的多了。

使用List<byte>而不是byte[] 它将为您提供所需的灵活性...

List<byte> b1 = new List<byte>() { 45, 46, 47, 50, 51, 52 };
List<byte> b2 = new List<byte> { 48, 49 };
b1.InsertRange(3, b2);

然后,无论出于何种原因都需要返回byte[] ,可以调用...

b1.ToArray();

看一下Array.CopyTo

从指定的目标数组索引处开始,将当前一维数组的所有元素复制到指定的一维数组。

如果性能不重要,请考虑:

var combined = first.Take(insertPosition)
                    .Concat(second)
                    .Concat(first.Skip(insertPosition))
                    .ToArray();

我想这几乎是您建议的四步算法,除了第一步“最后”。 但是,请注意,由于多种原因,这效率很低,包括不必要的动态缓冲区和第一个数组的冗余部分枚举。

否则,您的建议就可以了。

如果可以将对象换成更大的东西,则可以看一下类似List的东西,该列表具有可以满足您需要的InsertRange方法(http://msdn.microsoft.com/zh-cn/library/884ee1fz.aspx )。 当然,使用其他对象可能不是一个选择,但是它建议您采用一种简单的方法来做事情。 另外,其他对象可能更有用。 货比三家... :)

根据定义, 数组的 大小固定的 您不能插入或删除元素,而只能覆盖元素。

您应该改为一个列表 列表提供了用于插入或删除元素和子范围的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM