【问题标题】:In C# how can I truncate a byte[] array在 C# 中,我如何截断 byte[] 数组
【发布时间】:2011-11-21 15:21:08
【问题描述】:

我有一个大小相同的 byte[] 数组,我想将它截断成一个更小的数组?

我只是想把结尾砍掉。

【问题讨论】:

  • 了解以下所有答案仅影响持有数组的特定变量至关重要。也就是说,如果您有两个变量ab 指向您的数组,并且您使用复制或调整大小来更改ab 仍将指向原始数组!作为jason points out,如果你想要一个长度可以改变的对象,你需要使用List。也就是说,如果您有其他变量指向该对象,并且您需要所有此类变量才能看到更改。

标签: c#


【解决方案1】:

数组在 C# (.NET) 中是固定大小的。

您必须将内容复制到一个新的。

byte[] sourceArray = ...
byte[] truncArray = new byte[10];

Array.Copy(sourceArray , truncArray , truncArray.Length);

【讨论】:

    【解决方案2】:

    您可以使用Array.Resize,但这实际上只是制作原始数组的截断副本,然后用新数组替换原始数组。

    【讨论】:

      【解决方案3】:
          private static void Truncate() {
      
              byte[] longArray = new byte[] {1,2,3,4,5,6,7,8,9,10};
      
              Array.Resize(ref longArray, 5);//longArray = {1,2,3,4,5}
      
              //if you like linq
              byte[] shortArray = longArray.Take(5).ToArray();
      
          }
      

      【讨论】:

      • 有点模棱两可,因为您没有明确表示 Take(5) 是从前面拍摄的。不使用中点的示例可能会更好
      【解决方案4】:

      我通常创建一个扩展方法:

       public static byte[] SubByteArray(this byte[] byteArray, int len)
          {
              byte[] tmp = new byte[len];
              Array.Copy(byteArray, tmp, len);
      
              return tmp;
          }
      

      可以像这样在字节数组上轻松调用:

      buffer.SubByteArray(len)
      

      【讨论】:

      • 澄清一下,在 OP 的情况下,用法是 buffer = buffer.SubByteArray(len);
      【解决方案5】:

      您不能在 C# 中截断数组。它们的长度是固定的。

      如果你想要一个可以截断并像数组一样工作的数据结构,你应该使用List<T>。您可以使用List<T>.RemoveRange 方法来实现。

      【讨论】:

        【解决方案6】:

        顺便说一句,Array.Resize 方法需要更多时间才能完成。在我的简单案例中,我只需要调整字节数组的大小(约 8000 项到约 20 项):

        1. Array.Resize // 1728 滴答声
        2. Array.Copy // 8 个滴答声

        【讨论】:

        • 这可能不是一个有效的结果,因为 Resize 内部使用了副本。 referencesource.microsoft.com/#mscorlib/system/array.cs 我怀疑你的测试代码有问题——需要看看你做了什么。那个巨大的时间差 - 是否有可能您每次在调整大小测试中创建一个新数组,而不是在复制测试中?或者你没有运行你的测试循环足够的时间来平均任何中断?或者也许 Resize 比 Copy 更容易被打断,因此很难准确测试。
        【解决方案7】:

        您现在可以在 C# 中使用椭圆表示法。

        var truncArray = sourceArray[..10];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-26
          • 2011-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多