Эквивалент StringBuilder для байтовых массивов
Это прост, и я подумал, что мне ответят. Я попытался найти ответ здесь, но ничего не придумал - извиняюсь, если что-то я пропустил.
Во всяком случае, есть ли эквивалент StringBuilder, но для байт-массивов?
Я не беспокоюсь обо всех различных перегрузках Append()
- но я хотел бы видеть Append(byte)
и Append(byte[])
.
Есть ли что-нибудь вокруг или это рулонное время?
Ответы
Ответ 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;
}
}