web-dev-qa-db-ja.com

バイト配列のStringBuilderと同等

これは単純なものであり、私が答えたと思ったものです。私はここで答えを見つけようとしましたが、何も思いつきませんでした-私が見逃したものがある場合はお詫びします。

とにかく、StringBuilderに相当するものはありますが、バイト配列用ですか?

Append()のさまざまなオーバーロードのすべてについて気にする必要はありませんが、Append(byte)Append(byte[])を見たいと思います。

周りに何かありますか、それとも自分の時間ですか?

32
Matt Whitfield

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
31
Fredrik Mörk

MemoryStream アプローチは適切ですが、StringBuilderのような動作が必要な場合は、 BinaryWriter を追加してください。 BinaryWriterは、必要なすべての書き込みオーバーライドを提供します。

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

多分 - List<byte>

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

_List<byte>_次に、配列として必要な場合は、ToArray()を呼び出すことができます。

2
Aaron McIver
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;
    }
}
0
MStack