Эквивалент StringBuilder для байтовых массивов - PullRequest
31 голосов
/ 25 октября 2010

Это простой вопрос, и я подумал, что на него ответят. Я попытался найти здесь ответ, но ничего не нашел - так что извиняюсь, если что-то пропустил.

В любом случае, есть ли эквивалент StringBuilder, но для байтовых массивов?

Меня не беспокоят все различные перегрузки Append() - но я бы хотел увидеть Append(byte) и Append(byte[]).

Есть ли что-нибудь вокруг или это твое время?

Ответы [ 5 ]

31 голосов
/ 25 октября 2010

Будет ли MemoryStream работать на вас? Интерфейс может быть не таким удобным, но он предлагает простой способ добавления байтов, и когда вы закончите, вы можете получить содержимое как byte[], вызвав ToArray().

Более 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
16 голосов
/ 25 октября 2010

Подход MemoryStream хорош, но если вы хотите иметь поведение, подобное StringBuilder, добавьте BinaryWriter.BinaryWriter предоставляет все переопределения записи, которые вы можете захотеть.

MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
writer.Write((byte)67);
writer.Write(new byte[] { 68, 69 });
11 голосов
/ 25 октября 2010

Возможно List<byte>:

var byteList = new List<byte>();
byteList.Add(42);
byteList.AddRange(new byte[] { 1, 2, 3 });
2 голосов
/ 25 октября 2010

List<byte> Затем, когда вы хотите использовать его как массив, вы можете вызвать ToArray()

0 голосов
/ 27 февраля 2015
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;
    }
}
...