[解決済み] ストリームからのバイト配列の作成
質問
入力ストリームからバイト配列を作成する場合、どのような方法が好ましいですか?
以下は、.NET 3.5を使った私の現在の解決策です。
Stream s;
byte[] b;
using (BinaryReader br = new BinaryReader(s))
{
b = br.ReadBytes((int)s.Length);
}
やはりストリームのチャンクを読み書きするのが良いのでしょうか?
どのように解決するのですか?
それは、あなたが信頼できるかどうかにかかっています。
s.Length
. 多くのストリームでは、どれだけのデータがあるのかわかりません。そのような場合、そして.NET 4以前であれば、私はこのようなコードを使用します。
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
.NET 4以上なら
Stream.CopyTo
これは、基本的に私のコードのループと同じです。
MemoryStream
を呼び出す。
stream.CopyTo(ms)
を返し、さらに
ms.ToArray()
. 仕事は完了です。
なぜ私の回答が他の人より長いのか、その理由を説明すべきかもしれません。
Stream.Read
は、要求されたものすべてを読み取ることを保証するものではありません。例えば、ネットワークストリームから読み込む場合、たとえすぐにデータが増えるとしても、1パケット分を読み込んで戻るかもしれません。
BinaryReader.Read
はストリームの終わりか、指定したサイズまで進みますが、それでも最初にサイズを知っておく必要があります。
上記のメソッドは、読み出し(および
MemoryStream
) データがなくなるまで そして
MemoryStream
を使用して、データのコピーを配列で返します。もし、最初にサイズを知っていれば - あるいは
思う
を作成することができます。
MemoryStream
をそのサイズにする必要があります。同様に、最後にチェックを入れて、ストリームの長さがバッファと同じサイズであれば (
MemoryStream.GetBuffer
ということで、バッファを返せばいいわけです。ですから、上記のコードは最適化されているとは言えませんが、少なくとも正しいものでしょう。ストリームのクローズは呼び出し元が行うべきで、このコードはその責任を負いません。
参照 この記事 をご覧ください(別の実装もあります)。
関連
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] JavaでInputStreamをバイト配列に変換する
-
[解決済み] Windowsフォームアプリケーションで、アプリケーションの設定を保存するにはどうすればよいですか?
-
[解決済み] C#でByte[]Arrayをファイルに書き込むことはできますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] C#でStreamをbyte[]に変換する方法は?[重複しています]