.NET TIPS

ストリームからバイナリ・データを読み込み配列に格納するには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2010/03/04

 バイナリ・データ(=テキスト以外のデータ)をネットワークなどから読み込んで処理したい場合、通常はストリームからバイナリ・データを読み込み、それをバイト配列に格納することになる。本稿では、その手順について解説する。

MemoryStreamクラスによるバッファリング

 ストリームからデータを読み込む際、あらかじめデータ全体の長さが分かっていれば、そのサイズのバイト配列を最初に作成し、データを順に読み込んでいくだけでよいが、すべてのストリームで事前にサイズが分かるわけではない(Streamクラス(System.IO名前空間)のすべての派生クラスがLengthプロパティをサポートしているわけではない)。

 このため、ストリームから少しずつデータを読み込みながらメモリ上に保存していき、最後にデータ全体をバイト配列に変換するというのが一般的な手順だ。

 メモリ上に少しずつデータをため込んでいくような処理には、MemoryStreamクラス(System.IO名前空間)が使える。これはメモリ領域をストリームとして扱うクラスで、Writeメソッドによりバイナリ・データの書き込みが行え、そのメモリ領域は必要に応じて自動的に拡張される。また、ToArrayメソッドにより、メモリ領域のデータをバイト配列として取得できる。

 以下のサンプル・プログラム内のReadBinaryDataメソッドは、MemoryStreamクラスを利用してストリームからバイナリ・データを読み込み、それをバイト配列として返す処理を記述した例である。MemoryStreamクラスのWriteメソッドの引数には、メモリ・ストリームに書き込むバイト配列、そのバイト配列内の開始位置、書き込むバイト数を指定する。

// binaryread.cs

using System;
using System.IO;
using System.Net;

public class BinaryRead {

  // ストリームからデータを読み込み、バイト配列に格納
  static public byte[] ReadBinaryData(Stream st) {

    byte[] buf = new byte[32768]; // 一時バッファ

    using (MemoryStream ms = new MemoryStream()) {

      while (true) {
        // ストリームから一時バッファに読み込む
        int read = st.Read(buf, 0, buf.Length);

        if (read > 0) {
          // 一時バッファの内容をメモリ・ストリームに書き込む
          ms.Write(buf, 0, read);
        } else {
          break;
        }
      }
      // メモリ・ストリームの内容をバイト配列に格納
      return ms.ToArray();
    }
  }

  static void Main() {

    string url
      = "http://www.atmarkit.co.jp/fdotnet/images/fdotnet_m.gif";
    byte[] data;

    WebRequest req = WebRequest.Create(url);

    using (WebResponse res = req.GetResponse()) {
      using (Stream st = res.GetResponseStream()) {
        data = ReadBinaryData(st);
      }
      File.WriteAllBytes("test.gif", data);
    }
  }
}

// コンパイル方法:csc binaryread.cs
' binaryread.vb

Imports System.IO
Imports System.Net

Class Program

  ' ストリームからデータを読み込み、バイト配列に格納
  Shared Public Function ReadBinaryData(ByVal st As Stream) As Byte()

    Dim buf(32768) As Byte ' 一時バッファ

    Using ms As New MemoryStream()

      While (True)
        ' ストリームから一時バッファに読み込む
        Dim read As Integer = st.Read(buf, 0, buf.Length)

        If read > 0 Then
          ' 一時バッファの内容をメモリ・ストリームに書き込む
          ms.Write(buf, 0, read)
        Else
          Exit While
        End If
      End While

      ' メモリ・ストリームの内容をバイト配列に格納
      Return ms.ToArray()

    End Using
  End Function

  Shared Sub Main()
    Dim url As String _
      = "http://www.atmarkit.co.jp/fdotnet/images/fdotnet_m.gif"
    Dim data As Byte()

    Dim req As WebRequest = WebRequest.Create(url)

    Using res As WebResponse = req.GetResponse()
      Using st As Stream = res.GetResponseStream()
        data = ReadBinaryData(st)
      End Using
    End Using

    File.WriteAllBytes("test.gif", data)

  End Sub
End Class

' コンパイル方法:csc binaryread.cs
Web上の画像データをバイト配列に読み込み保存するサンプル・プログラム(上:C#、下:VB)

 このサンプル・プログラムのMainメソッドでは、Web上の画像に対するストリームを開き、そこからReadBinaryDataメソッドにより画像データをバイト配列に読み込み、最後にファイル(test.gif)に出力している。End of Article

カテゴリ:クラス・ライブラリ 処理対象:バイナリ・ファイル
使用ライブラリ:Streamクラス(System.IO名前空間)
使用ライブラリ:MemoryStreamクラス(System.IO名前空間)

この記事と関連性の高い別の.NET TIPS
バイト配列→画像オブジェクト/画像オブジェクト→バイト配列の変換を行うには?
バイト列と数値を変換するには?
バイナリ・ファイルを読み書きするには?
ストリームを簡単にコピーするには?
文字列のバイト数を取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH