Подтвердить что ты не робот

Эквивалент StringBuilder для байтовых массивов

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

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

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

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

4b9b3361

Ответ 1

Будет ли 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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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