用于字节数组的StringBuilder的等效项

时间:2010-10-25 14:36:08

标签: c# bytearray stringbuilder

这是一个简单的,我认为会得到回答。我确实试图在这里找到答案,但没有提出任何答案 - 如果有我错过的东西,请道歉。

无论如何,是否存在StringBuilder的等价物但是对于字节数组?

我对Append()的所有不同重载并不感到烦恼 - 但我希望看到Append(byte)Append(byte[])

周围有什么东西或者是你自己的时间吗?

5 个答案:

答案 0 :(得分:31)

MemoryStream会为你效劳吗?界面可能不太方便,但它提供了一种附加字节的简单方法,当你完成后,你可以通过调用ToArray()将内容作为byte[]获取。

可以通过制作扩展方法来实现更像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

答案 1 :(得分:16)

MemoryStream方法很好,但如果您想要类似StringBuilder的行为,请添加BinaryWriter。 BinaryWriter提供了您可能想要的所有写入覆盖。

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

答案 2 :(得分:11)

可能List<byte>

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

答案 3 :(得分:2)

List<byte>然后,当您想要它作为数组时,您可以调用ToArray()

答案 4 :(得分: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;
    }
}