使用c#将字节数组插入到特定位置的另一个字节数组中

时间:2011-01-06 15:11:18

标签: c# arrays bytearray

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

我正在尝试将一个简单的c#字节数组插入到特定位置的另一个字节数组中。例如。现有的字节不应该被覆盖,而只是向后移动。真的就像你在现有文本块中复制页面一些文本块一样。

  1. 到目前为止,我将创建一个具有两个现有数组长度的新数组。
  2. 将第一个数组复制到新数组中,直到插入开始的位置。
  3. 添加插入的数组
  4. 添加现有阵列的其余部分。
  5. 但我认为这是常见的事情,应该更容易吗?或者我错了吗?

6 个答案:

答案 0 :(得分:8)

  

但我认为这是常见的事情

如果您经常将大量数据插入另一大块数据的中间,那么您可能会考虑使用旨在实现此目的的数据结构。数组被设计为固定大小并且在内容中可变。如果您的要求包含“变量大小”,那么数组对您来说是错误的数据类型。请考虑使用双向链表或可连接的双端队列。

  

应该更容易?

您已经确定了一个简单的四步算法,可以满足您的需求。它并没有那么容易。

答案 1 :(得分:6)

使用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();

答案 2 :(得分:4)

请看Array.CopyTo

  

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

答案 3 :(得分:1)

如果表现不重要,请考虑:

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

我认为这几乎是你建议的四步算法,除了第一步“结束时”。但是,请注意,由于多种原因,这是低效的,包括不必要的动态缓冲区和第一个阵列的冗余部分枚举。

否则,你所建议的完全没问题。

答案 4 :(得分:0)

如果您可以将对象换成更大的东西,那么您可以查看具有InsertRange方法的List之类的东西(http://msdn.microsoft.com/en-us/library/) 884ee1fz.aspx)。当然,使用不同的对象可能不是一种选择,但它建议一种简单的方法来做事。其他对象也可能更有用。到处走走...... :)

答案 5 :(得分:0)

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

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