検索
連載

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

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「.NET TIPS」のインデックス

連載目次

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

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://atmarkit.itmedia.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://atmarkit.itmedia.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)に出力している。

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

「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る