2010-10-25 15 views
25

Este es uno simple, y uno que pensé que habría sido respondido. Intenté encontrar una respuesta aquí, pero no se me ocurrió nada, así que me disculpo si hay algo que me he perdido.Equivalente a StringBuilder para matrices de bytes

De todos modos, ¿existe un equivalente de StringBuilder pero para matrices de bytes?

No me molestan todas las sobrecargas diferentes de Append() - pero me gustaría ver Append(byte) y .

¿Hay algo a su alrededor o es tiempo de rodar por sí mismo?

Respuesta

25

Would MemoryStream trabajo para usted? La interfaz puede no ser tan conveniente, pero ofrece una manera simple de agregar bytes, y cuando haya terminado puede obtener el contenido como byte[] llamando al ToArray().

Una interfaz de tipo más StringBuilder probablemente podría lograrse haciendo un método de extensión.

actualización
Los métodos de extensión podría tener este aspecto:

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

Uso:

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

Sí, me gustaría ... Me gusta ese enfoque ... Gracias –

+0

¿Puedo preguntar? No he visto la sintaxis 'new [] {value}' before - ¿eso es inferir el tipo de la matriz? –

+2

@Matt: sí, eso es correcto. En el método de extensión, 'value' es de tipo' byte', por lo que 'byte []' se deduce. En la última muestra, necesito especificar 'new byte []' ya que el compilador inferiría el tipo 'int' en caso contrario. –

11

Probablemente List<byte>:

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

... y luego Anexar (byte) se convierte en Añadir (byte) y Append (byte []) se convierte en AddRange (byte []). –

+0

Tenga en cuenta que al igual que con 'StringBuilder', agregar elementos a una' Lista' se amortiza O (1). – Brian

+0

Bien, bien, solo una pregunta ... ¿Sería tan eficiente? Sé que List <> hace algunas copias eficientes para AddRange bajo el capó, pero no sabía si eso funcionaba como la forma más eficiente de hacerlo. –

2

List<byte> Entonces cuando lo desee como una matriz puede llamar ToArray()

12

El MemoryStream enfoque es bueno, pero si quieres tener un comportamiento tipo StringBuilder, agrega un BinaryWriter. BinaryWriter proporciona todas las anulaciones de escritura que pueda desear.

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

+1 ¡Buena solución! – kol

+0

También puede obtener una nueva clase de BinaryWriter si necesita escritores especiales. Hice uno que manejaba las conversiones de hton. –

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