C#でstruct System.Byte byte []をSystem.IO.Streamオブジェクトに変換するにはどうすればよいですか?


回答:


1286

バイト配列をストリームに変換する最も簡単な方法は、MemoryStreamクラスを使用することです。

Stream stream = new MemoryStream(byteArray);

19
ストリームを作成するこの方法は理想的でない可能性があることに注意してください:「このコンストラクターは基になるストリームを公開しません。GetBufferはUnauthorizedAccessExceptionをスローします。」msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noocyte

25
@noocyteの理想的な方法を教えてください。
developerbmw

6
ただしstream.ToArray()、バイト配列を元に戻す場合は、引き続き使用できます。
フロリアン

2
このようにバイト配列からストリームを構築すると、どのようなオーバーヘッドが発生しますか?メモリ使用量はほとんど私が疑問に思っているものです。
jocull

344

あなたはMemoryStream.Writeメソッドを探しています。

たとえば、次のコードはbyte[]配列の内容をメモリストリームに書き込みます。

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream();
stream.Write(myByteArray, 0, myByteArray.Length);

または、バイト配列に基づいて、サイズを変更できない新しいMemoryStreamオブジェクトを作成することもできます

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream(myByteArray);

26
これが最良の答えです。それは簡潔であり、すべての実用的なアプリケーションをカバーしています。ここに示されているように、バイト配列ベースのコンストラクタを使用するだけでは問題があります-結果のストリームはサイズ変更できません。
Jduv 2012

17
また、後でストリームをリセットすることを忘れないでください:stream.Seek(0、SeekOrigin.Begin);
Minh Nguyen

最初のオプションMemoryStream.Writeはメモリ消費量がはるかに多いことに注意してくださいnew MemoryStream(myByteArray)
Alex

なぜ、まさにそれが@jitbitなのでしょうか?をされている多くの私は、パフォーマンス上のコメントにこの答えを更新するつもりだったならば、私はいくつかのより多くの情報が必要と思いますので、私は任意の.NETをしたので、年。
コーディグレイ

2
MemoryStreamデフォルトでは、バッファに割り当てられた追加のスペースがあります(たとえば、リストの場合と同じです)。これは、容量を設定できるオーバーロードを使用して簡単に処理できますが、ストリームにデータを書き込むことを期待していない場合(または必要になる可能性がある追加のバイト数がわかっている場合)にのみ非常に役立ちます。 )。しかし、jitbitは、byte[]コンストラクターを使用するときに配列がコピーされないという事実を参照しているのではないかと思いMemoryStreamます。これは、引数の配列を参照しています。これは良いことも悪いこともあり、MSDNに記載されていないのは少し残念です:)
Luaan

32

(だけでなくMemoryStream)ストリームに書き込む一般的な方法は、次のものを使用することBinaryWriterです。

static void Write(Stream s, Byte[] bytes)
{
    using (var writer = new BinaryWriter(s))
    {
        writer.Write(bytes);
    }
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.