【问题标题】:Equivalent of StringBuilder for byte arrays等效于字节数组的 StringBuilder
【发布时间】:2011-04-30 06:12:58
【问题描述】:

这是一个简单的问题,我认为会得到回答。我确实试图在这里找到答案,但没有想出任何东西 - 如果有什么我错过了,请道歉。

不管怎样,除了字节数组之外,是否有 StringBuilder 的等价物?

我并不担心 Append() 的所有不同重载 - 但我想看看 Append(byte)Append(byte[])

周围有什么东西吗?或者是你自己的时间?

【问题讨论】:

    标签: c# bytearray stringbuilder


    【解决方案1】:

    在 codeproject 上查看 this 项目。 正如其他答案中所建议的那样,它只是一个使用 MemoryStream 实现解决方案的类。

    【讨论】:

      【解决方案2】:

      MemoryStream 方法很好,但如果您想要类似 StringBuilder 的行为,请添加 BinaryWriter。 BinaryWriter 提供您可能需要的所有写入覆盖。

      MemoryStream stream = new MemoryStream();
      BinaryWriter writer = new BinaryWriter(stream);
      writer.Write((byte)67);
      writer.Write(new byte[] { 68, 69 });
      

      【讨论】:

      • 如果您需要特殊的编写器,也可以从 BinaryWriter 派生一个新类。我做了一个处理 hton 转换的。
      • 完成后,使用stream.ToArray();获取数组
      • 请注意,BinaryWriterWrite(String) 方法将长度前缀写入流!
      【解决方案3】:
      using System;
      using System.IO;
      
      public static class MemoryStreams
      {
          public static MemoryStream Append(
              this MemoryStream stream
              , byte value
              , out bool done)
          {
              try
              {
                  stream.WriteByte(value);
                  done = true;
              }
              catch { done = false; }
              return stream;
          }
      
          public static MemoryStream Append(
              this MemoryStream stream
              , byte[] value
              , out bool done
              , uint offset = 0
              , Nullable<uint> count = null)
          {
              try
              {
                  var rLenth = (uint)((value == null) ? 0 : value.Length);
      
                  var rOffset = unchecked((int)(offset & 0x7FFFFFFF));
      
                  var rCount = unchecked((int)((count ?? rLenth) & 0x7FFFFFFF));
      
                  stream.Write(value, rOffset, rCount);
                  done = true;
              }
              catch { done = false; }
              return stream;
          }
      }
      

      【讨论】:

        【解决方案4】:

        MemoryStream 适合你吗?该接口可能不太方便,但它提供了一种附加字节的简单方法,完成后,您可以通过调用ToArray()byte[] 的形式获取内容。

        一个更像StringBuilder的接口可能可以通过扩展方法来实现。

        更新
        扩展方法可能如下所示:

        public static class MemoryStreamExtensions
        {
            public static void Append(this MemoryStream stream, byte value)
            {
                stream.Append(new[] { value });
            }
        
            public static void Append(this MemoryStream stream, byte[] values)
            {
                stream.Write(values, 0, values.Length);
            }
        }
        

        用法:

        MemoryStream stream = new MemoryStream();
        stream.Append(67);
        stream.Append(new byte[] { 68, 69 });
        byte[] data = stream.ToArray();  // gets an array with bytes 67, 68 and 69
        

        【讨论】:

        • 是的,我喜欢这种方法...谢谢
        • @Matt:是的,这是正确的。在扩展方法中,value 的类型为byte,因此推断出byte[]。在最后一个示例中,我需要指定 new byte[],否则编译器会推断出类型 int
        • @Fredrik Mörk:有没有办法从 MemoryStream 的开头咀嚼数据,所以它像队列一样工作,或者是否有任何其他 CLR 类可以用作进程内管道?
        • @supercat:据我所知,MemoryStream 中没有此功能。我不知道除了Queue&lt;byte&gt; 之外的任何其他课程。
        • 为了使它更像一个 StringBuilder,你可以让扩展方法返回流本身。虽然这可能会牺牲少量的效率,但在构建器模式中使用每个方法返回构建器的情况并不少见,以便可以在一个长语句中调用它们。
        【解决方案5】:

        应该是List&lt;byte&gt;:

        var byteList = new List<byte>();
        byteList.Add(42);
        byteList.AddRange(new byte[] { 1, 2, 3 });
        

        【讨论】:

        • ...然后 Append(byte) 变成 Add(byte) 并且 Append(byte[]) 变成 AddRange(byte[])。
        • 请注意,与StringBuilder 一样,向List 添加元素的摊销时间为O(1)。
        • 好的,很酷 - 只是一个问题......这会同样有效吗?我知道 List 在后台为 AddRange 做了一些有效的副本,但我不知道这是否是最有效的方法?
        • @Matt :与StringBuilder 一样,C# List 使用大于数据结构大小的后备容量来实现恒定时间插入。此容量可根据需要加倍。此策略与 StringBuilder 用于避免过多内存分配的策略相同。
        • @Matt: 是的,如果你传递了ICollection&lt;T&gt;,那么AddRange 方法会使用集合的Count 属性来将列表预分配到正确的大小(如果需要)。如果不是ICollection&lt;T&gt;,则需要在添加元素时即时调整列表大小。
        【解决方案6】:

        List&lt;byte&gt;然后当你想要它作为一个数组你可以调用ToArray()

        【讨论】:

          猜你喜欢
          • 2014-10-06
          • 2014-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          • 1970-01-01
          相关资源
          最近更新 更多