初心者入門

バイナリデータとは

バイナリデータとは
As an outsourced case from a major telecommunications carrier, we reviewed and evaluated memory-saving search methods that target XML binary data and efficient search methods on a P2P platform.

バイナリデータの送信と受信

XMLHttpRequest オブジェクトの responseType プロパティで、サーバーに期待する応答の種類を変更することができます。設定可能な値は空文字列 (既定), "arraybuffer" , "blob" , "document" , "json" , "text" です。 response プロパティにはエンティティの本体が responseType に応じて ArrayBuffer , Blob , Document , JSON または文字列で格納されます。要求が不完全であったり成功しなかった場合は null になります。

上記の方法の代わりに Blob インタフェースを利用して arraybuffer データから直接 Blob を構築します。

古いブラウザーでのバイナリデータの受信

下に示す load_binary_resource() 関数は、指定した URL からロードしたバイナリデータを関数の呼び元に返します。

マジックは5行目で、 MIME タイプを上書きしてブラウザーに強制的に、ユーザー定義の文字セットを使用したプレインテキストとして扱わせます。これにより、ブラウザーはこれを解釈せず、未処理のままバイト列を通します。

上記のサンプルでは、ロードしたバイナリデータ内のオフセット x のバイトを取得します。 x の有効範囲は 0 から filestream.length-1 です。

バイナリデータの送信

XMLHttpRequest の send メソッドが拡張され、 ArrayBuffer , Blob , または File オブジェクトを受け付ける事でバイナリデータの送信が容易になりました.

続くサンプルはその場で作ったテキストファイルを POST メソッドで "file" をサーバーに送信します。このサンプルはプレインテキストを使っていますが、代わりにデータがバイナリファイルだとイメージする事も出来ます。

バイナリデータとして型付き配列を送信

同等にバイナリデータとして JavaScript の型付き配列を送信することもできます。

これは 8ビット整数の 512 バイトの配列を構築して送信します。勿論、好きな任意のバイナリデータで使えます。

メモ: XMLHttpRequest を使った バイナリデータとは ArrayBuffer オブジェクトの送信サポートは Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)で追加されました。他のブラウザーのサポート情報をここに追記して下さい。

フォーム送信とファイルアップロード

Firefox 独自のサンプル

このサンプルでは非同期にバイナリコンテンツを送信するのに POST メソッドと Firefox にある非標準の sendAsBinary() を使います。

4行目で Content-Length ヘッダに 741 をセットするのは、データが 741 バイト長である事を示します。送信データの実際のサイズに応じてこの値を変更する必要があります。

5行目では sendAsBinary() バイナリデータとは メソッドを使ってリクエストをはじめます。

メモ: この sendAsBinary メソッドは標準外であり、 Gecko 31 (Firefox 31 / Thunderbird 31 / SeaMonkey 2.28) で非推奨扱いになって、まもなく削除されるでしょう。上で説明したように、標準の send(Blob data) メソッドを使用することができます。

また、 nsIFileInputStream のインスタンスの send() を通す事でバイナリコンテンツを送信できます。この場合は、あなた自身が Content-Length ヘッダセットしてはならず、この情報はストリームから自動的に取得されます。

21. Binary file¶

int32 や double などのプリミティブ型や、プリミティブ型で構成された trivially copyable なクラス ( Point , Vec2 , Rect , ColorF ) などは、単純にデータをコピーするだけで容易にバイナリデータとして扱えますが、 Array や String など、ポインタで内部データを管理するデータ型をバイナリデータとして適切に扱には少し手間がかかります。

この章の後半て説明する シリアライズ機能 を使うと、 Array や String , その他いくつかの Siv3D の trivially copyable でないクラスを簡単にバイナリデータとして扱えるようになります。独自に定義した型をシリアライズに対応させることもできます。

21.2 バイナリファイルに単純な値を書き込む¶

ファイルにバイナリデータを書き込むには BinaryWriter の機能を使います。 BinaryWriter のコンストラクタ引数に、書き込み先のファイルのパスを渡します。このファイルパスは、実行ファイルがあるフォルダ(開発中は App フォルダ)を基準とする相対パスか、絶対パスを使用します。ファイルが使用中だったり、ファイル名が不正なものだったりしてオープンに失敗したかどうかは if (!writer) で調べられます。

.BinaryWriter::write() に trivially copyable な型の値を渡すと、その値のバイナリデータをコピーしてファイルの末尾に追加で書き込みます。

21.3 バイナリファイルから単純な値を読み込む¶

バイナリファイルからバイナリデータを読み込むには BinaryReader の機能を使います。 BinaryReader のコンストラクタ引数に、読み込みたいテキストファイルのパスを渡します。このファイルパスは、実行ファイルがあるフォルダ(開発中は App フォルダ)を基準とする相対パスか、絶対パスを使用します。リリース用のアプリを作るときには埋め込みリソースパスの使用を推奨します。ファイルが存在しない場合など、オープンに失敗したかどうかは if (!reader) で調べられます。

オープン直後は、読み込み位置はファイルの先頭にセットされています。 BinaryReader::read() に trivially copyable な型の変数を参照で渡すと、読み込み位置を始点とし、その値のサイズ分のバイナリデータを読み込んでその変数にコピーし、読み込み位置をその分進めて true を返します。読み込み位置がすでにファイルの終端にあって、これ以上読み込めないときには false を返します。

読み込み位置の移動¶

BinaryReader::setPos() で、読み込み位置を指定した場所に移動できます。 バイナリデータとは BinaryReader::skip() で、指定したサイズ分読み飛ばすことができます。

21.4 ファイルをオープン・クローズするタイミングを制御する¶

BinaryReader のコンストラクタでファイルをオープンせずに、 BinaryReader::open() でファイルをオープンすることもできます。オープンに成功した場合は true , 失敗した場合は false を返します。

また通常は BinaryReader のデストラクタが実行されるタイミングでファイルがクローズされますが、例えば内容を読み込んだあとにファイルを削除したり、別の内容を書き込みたい場合には、ファイルがオープンされたままだと操作ができないため、すぐにクローズしたいというケースがあるでしょう。そうしたときには BinaryReader::close() でファイルを明示的にクローズします。

21.5 バイナリファイルに複雑なデータを書き込む¶

String や Array のように単純にコピーできない ( trivially バイナリデータとは copyable でない) データをバイナリファイルで扱うのは少し手間がかかります。後述するシリアライズ機能を使えば簡単になりますが、まずはシリアライズ機能を使わないサンプルを紹介します。

21.6 バイナリファイルから複雑なデータを読み込む¶

前項に続いて、 String バイナリデータとは や Array のように単純にコピーできない ( trivially copyable でない) データを、シリアライズ機能を使わずにバイナリファイルで扱う方法です。

21.バイナリデータとは 7 バイナリファイルに複雑なデータを書き込む(シリアライズ機能)¶

シリアライズ機能を使うと、シリアライズに対応したデータ型 ( trivially copyable でない型も含む) を、少ない記述でバイナリファイルで扱えます。ファイルにシリアライズ機能を使ってバイナリデータを書き込むには Serializer の機能を使います。 Serializer のコンストラクタ引数に、書き込み先のファイルのパスを渡します。実行ファイルがあるフォルダ(開発中は App フォルダ)を基準とする相対パスか、絶対パスを使用します。ファイルが使用中だったり、ファイル名が不正なものだったりしてオープンに失敗したかどうかは if (!writer.getWriter()) で調べられます。 Serializer::operator() で値を渡すと、そのデータをシリアライズしてファイルの末尾に追加で書き込みます。

21.8 バイナリファイルから複雑なデータを読み込む(シリアライズ機能)¶

シリアライズ機能を使って書き込んだデータを読み込むには Deserializer の機能を使います。 Deserializer のコンストラクタ引数に、読み込みたいテキストファイルのパスを渡します。このファイルパスは、実行ファイルがあるフォルダ(開発中は App フォルダ)を基準とする相対パスか、絶対パスを使用します。リリース用のアプリを作るときには埋め込みリソースパスの使用を推奨します。ファイルが存在しない場合など、オープンに失敗したかどうかは if (!reader.getReader()) で調べられます。 Deserializer::operator() で値を渡すと、そのデータをシリアライズしてファイルの末尾に追加で書き込みます。

21.9 ユーザ定義型をシリアライズに対応させる¶

ユーザが定義したクラスをシリアライズに対応させるには、 template void SIV3D_SERIALIZE(Archive& archive) という public メンバ関数をクラスに実装します。 archive() に、シリアライズに対応したオブジェクトを渡すコードを書くと、そのクラスはシリアライズ可能になり、 Serializer や Deserializer で読み書きできるようになります。

関連記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる