【问题标题】:Insert a byte array into another byte array at a specific position with c#用c#将一个字节数组插入到另一个字节数组的特定位置
【发布时间】:2011-01-06 15:11:17
【问题描述】:

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

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

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

但我认为这是常见的事情,应该更容易?还是我错了?

【问题讨论】:

  • 您确定不想使用 List 代替吗?

标签: c# arrays bytearray


【解决方案1】:

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

【讨论】:

  • 我应该提到,我正在对可能变得非常大的文件执行此操作。但我想我得到了我正在寻找的答案。有多种方法可行,但就像在这些真人秀节目中一样,我必须选择一种:-)
  • @Remy:请注意,Insert 是一个 O(n) 操作。如果您希望使用许多非常小的字节列表插入,您应该考虑使用LinkedList&lt;T&gt;
  • 谢谢!非常干净和精确。
【解决方案2】:

但我认为这是常见的事情

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

并且应该更容易?

您已经确定了一个简单的四步算法,可以满足您的需求。没有比这更容易的了。

【讨论】:

    【解决方案3】:

    Array.CopyTo

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

    【讨论】:

    • 对,这将有助于实现我上面描述的流程。希望有更简单的方法吗?
    • @Remy - 不是真的,如果你想使用数组的话。
    • -1 CopyTo 将根据起始索引覆盖内容; OP 表示他们不想这样做。
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 当然,作为一个实现细节,列表只是一个数组的视图;所有的插入和删除只是为你做数组复制操作。
        • 是的,确实如此。最后,List 类在内部执行 OP 不想自己编写的相同算法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 2015-06-09
        • 2014-02-15
        • 2019-05-13
        • 1970-01-01
        相关资源
        最近更新 更多