2010-10-25 5 views
25

Dies ist eine einfache, und eine, die ich dachte, wäre beantwortet worden. Ich habe versucht, hier eine Antwort zu finden, habe aber nichts gefunden - also entschuldige mich, wenn ich etwas übersehen habe.Äquivalent von StringBuilder für Byte-Arrays

Wie auch immer, gibt es ein Äquivalent von StringBuilder, aber für Byte-Arrays?

Ich bin nicht über die verschiedenen Überlastungen von Append() gestört - aber ich würde gerne Append(byte) und Append(byte[]) sehen.

Gibt es etwas in der Nähe oder ist es Zeit zum Selbstdrehen?

Antwort

25

Would MemoryStream Arbeit für Sie? Die Schnittstelle ist möglicherweise nicht ganz so praktisch, bietet aber eine einfache Möglichkeit zum Anhängen von Bytes. Wenn Sie fertig sind, können Sie den Inhalt als byte[] abrufen, indem Sie ToArray() aufrufen.

Eine weitere StringBuilder ähnliche Schnittstelle könnte wahrscheinlich durch eine Erweiterungsmethode erreicht werden.

aktualisieren
Erweiterungsmethoden könnte wie folgt aussehen:

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

Verbrauch:

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

Ja würde es - ich mag diesen Ansatz ... Danke –

+0

Kann ich einfach fragen - Ich habe die Syntax 'new [] {value}' vorher noch nicht gesehen - ist das der Typ des Arrays ableiten? –

+2

@Matt: Ja, das ist richtig. In der Erweiterungsmethode ist "Wert" vom Typ "Byte", daher wird "Byte []" abgeleitet. Im letzten Beispiel muss ich 'new byte []' angeben, da sonst der Compiler den Typ 'int' ableitet. –

11

Wahrscheinlich List<byte>:

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

... und dann anhängen (Byte) wird hinzufügen (Byte) und Anfügen (byte []) wird AddRange (byte []). –

+0

Beachten Sie, dass, wie bei 'StringBuilder', das Hinzufügen von Elementen zu einer' List' amortisiert ist O (1). – Brian

+0

Ok, cool - nur eine Frage ... Wäre das genauso effizient? Ich weiß, List <> macht einige effiziente Kopien für AddRange unter der Haube, aber ich wusste nicht, ob das als der effizienteste Weg das tut? –

2

List<byte> Dann, wenn Sie es als ein Array möchten, können Sie rufen ToArray()

12

Die MemoryStream Ansatz ist gut, aber wenn Sie StringBuilder-ähnliches Verhalten haben möchten, fügen Sie eine BinaryWriter hinzu. BinaryWriter bietet alle Schreibüberschreibungen, die Sie möchten.

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

+1 Schöne Lösung! – kol

+0

Sie können auch eine neue Klasse von BinaryWriter ableiten, wenn Sie spezielle Writer benötigen. Ich habe einen gemacht, der Hton Conversions gehandhabt hat. –

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