2010-10-25 58 views
25

这是一个简单的,我认为会得到答案的。我确实试图在这里找到一个答案,但没有提出任何事情 - 如果有一些我错过了的话,我很抱歉。字节数组的StringBuilder等效

无论如何,是否有相当于StringBuilder,但字节数组?

我并不关心Append()的所有不同过载 - 但我想看到Append(byte)Append(byte[])

周围有什么东西还是自己动手?

回答

25

MemoryStream为你工作?界面可能不太方便,但它提供了一种简单的附加字节的方法,当你完成后,你可以通过调用ToArray()来获得内容为byte[]

更多StringBuilder -like接口可能可以通过扩展方法来实现。

更新
扩展方法看起来是这样的:

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 
+0

是的,它会 - 我喜欢这种方法......谢谢 – 2010-10-25 14:43:07

+0

我可以问一下 - 我之前没有真正看到'new [] {value}'的语法 - 是推断数组的类型吗? – 2010-10-25 14:51:25

+2

@Matt:是的,这是正确的。在扩展方法中,'value'是'byte'类型,所以'byte []'被推断出来。在最后一个示例中,我需要指定'new byte []',否则编译器会推断'int'类型。 – 2010-10-25 14:53:02

11

大概List<byte>

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

...然后追加(字节)变为添加(字节),并追加(字节[])变的AddRange(字节[])。 – 2010-10-25 14:39:57

+0

请注意,与'StringBuilder'一样,将元素添加到'List'将被摊销O(1)。 – Brian 2010-10-25 14:43:03

+0

好的,很酷 - 只有一个问题......会有效吗?我知道List <>在底层为AddRange做了一些有效的拷贝,但我不知道这是否是最有效的方法呢? – 2010-10-25 14:43:28

2

List<byte>然后,当你想把它当作一个数组,你可以调用ToArray()

12

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

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

+1尼斯解决方案! – kol 2012-12-28 18:54:46

+0

如果您需要特殊作者,您也可以从BinaryWriter派生一个新类。我做了一个处理hton转换的程序。 – 2014-02-18 22:44:45

0
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; 
    } 
}