通貨ペア

バイナリデータとは

バイナリデータとは
一方、日本語の文字 (ひらがな、カタカナ、漢字など) などは UTF-8 や Shift-JIS といった文字コードが使われ、複数バイトで表現されるため、 マルチバイト文字コード と呼ばれます。ただし、多くのマルチバイト文字コードは、ASCII コードと下位互換があります。(先頭 bit が 0 のときは ASCII と判断)

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 で読み書きできるようになります。

バイナリデータとは

まず、バイナリファイルを扱う際に必要となる基礎知識についておさらいします。すべてのファイルは、テキストファイルバイナリファイル のどちらかに分類されます。

ファイルタイプ説明
テキストファイルWindows のメモ帳など、通常のテキストエディタで読み書きできるファイルです。文字、改行、タブ文字などから構成されます。拡張子 .txt .htm .css .cgi .pl などのファイルがこれに分類されます。
バイナリファイル画像ファイルやワープロのファイルなど、文字や改行などの特殊文字コード以外の情報を含んでいるファイルです。拡張子 .gif .jpg .mpg .doc .xls .exe などのファイルがこれに分類されます。

◆ 改行コード

テキストファイルで用いられる 改行 を示すコードは OS によって異なります。

OS改行コード
文字表現コード表現意味表現
Windows\r\n0d 0aCR LF
UNIX系\n0aLF
旧 Macintosh\r0dCR

Mac OS X からは UNIX 系の OS がベースになっているため、改行コードも \n になりました。CR はキャリッジリターン(復帰)、LF はラインフィード(改行)を意味します。

◆ テキストモードとバイナリモード

OS に依存してプログラムを print "Hello\n"; から print "Hello\r\n"; に書き換えなくてもすむように、Windows ではファイルを読み書きする際のモードに、テキストモードバイナリモード という機能をサポートしています。

モード説明
テキストモードテキストファイルの読み書きに適したモードです。書き込み時は \n → \r\n バイナリデータとは の変換、読み込み時は \r\n → \n の変換が自動的に行われます。このため、print FILE "Hello\n"; としても、ファイルには "Hello\r\n" バイナリデータとは バイナリデータとは が書き込まれることになります。
バイナリモードバイナリファイルを読み書きする際に適したモードです。改行コードの自動変換は行われません。

■ バイナリファイルを読みこむ(binmode, read)

◆ バイナリファイルを読み込む際の注意

標準入出力やオープンしたファイルは通常テキストモードになっています。この状態でバイナリファイルを読み書きすると、0a と 0d バイナリデータとは 0a の自動変換が働いてしまい、データが壊れてしまいます。

Windows でバイナリファイルを読み込む際には、binmode() を用いて、指定したファイルハンドルをバイナリモードに設定する必要があります。UNIX では binmode() を呼び出しても何の変化もありません。

read() バイナリデータとは バイナリデータとは は、ファイルから $size バイト分のデータを読みとって変数 $buf に代入します。成功すると読みこんだバイト数を、さもなくば未定義値を返します。ファイルの終端に達すると 0 を返します。

■ バイナリファイルに書きこむ

◆ バイナリファイルへの書き込み

バイナリファイルに書きこむには、print() を用います。write() という関数もありますが、これは read() に対応するものではありません。バイナリファイルを書き出す際は binmode() でバイナリモードに設定しておいて、print で書き出します。

■ バイナリデータに詰めこむ(pack)

◆ バイナリデータにパックする

pack() は、数値や文字列を書式に従ってバイナリデータに詰めこみます。"C" の部分は型指定文字と呼ばれます。CCC や C3 は3個の符号無し1バイト値、C* は任意の個数の符号無し1バイト値を意味します。

◆ packの型指定文字

■ バイナリデータを解釈する(1)(unpack)

unpack() は、pack() と逆で、バイナリデータ(文字列を含む)を数値の配列に変換します。型指定文字は pack() と同様です。

上記では、ABC の文字コードや、\x81 などのデータを数値配列に変換して表示しています。実行結果は次のようになります。

■ バイナリデータを解釈する(2)(ord)

ord(data) は、data の最初の1バイトの文字コードを数値として返します。unpack("バイナリデータとは C", data) と同じ意味を持ちます。

【図解】バイナリとテキスト(ascii)の違いと利点,判別 ~fileとNWプロトコルでの扱い~

一方、日本語の文字 (ひらがな、カタカナ、漢字など) などは UTF-8 や Shift-JIS といった文字コードが使われ、複数バイトで表現されるため、 マルチバイト文字コード と呼ばれます。ただし、多くのマルチバイト文字コードは、ASCII コードと下位互換があります。(先頭 bit が 0 のときは ASCII と判断)

バイナリとテキストの比較

形式バイナリテキスト
概要- コンピュータが理解しやすい形式
- Binary Editorで開くと 0 と 1 の
羅列が表示される
- 人間が理解しやすい形式
- Text Editorで開くと文章が表示される
意味を成す
構成要素
- 0 or 1 の羅列
- 定義や扱いはアプリによって変わる
- 文字列
- 定義は不変 (文字コードの規約に従う)
ファイル[バイナリファイルの例]
.exe (実行可能ファイル)
.docx
.pdf
.dat (アプリが読み込むデータ)
[テキストファイルの例]
.txt
.html / .css
.ldif (ldap の記述方式)
.バイナリデータとは c / .h (C 言語ソースコード)
NWプロト
コル
[バイナリ形式のNWプロトコルの例]
- NTP
- RIP / OSPF / BGP
[アスキー形式のNWプロトコルの例]
- http v1.0 v1.1
- SMTP
- telnet
- FTP Control (データ転送はバイナリ)
- LDAP (一部バイナリを含む)

厳密に言うと、「バイナリファイル」と分類されていても文字コードを意識した文字列が埋め込まれているケースのほうが多いでしょう。
一方「テキストファイル」というと『完全に文字コードに従って構成されているファイル』を指すことが多いです。
そういう意味では、バイナリデータとテキストデータの割合がどのくらいになればバイナリファイルと呼ぶのか、という点については曖昧で、具体的な基準はありません。

テキストエディタとバイナリエディタ

テキストエディタ

以下にバイナリファイルである .docx をテキストエディタ (sakura エディタ) で開いた時の例を示します。

バイナリエディタ

一方、バイナリファイルは stirling などのバイナリエディタで開くことで、0 と 1 の羅列を確実に確認することができます。そして 0 を 1 に、または 1 を 0 に修正することも可能です。

ただし、当然ながら「何ビット目が 0 の場合はどのような意味があり、1 の場合はどのような意味があり、、、」というのを人間が理解していないと、内容の確認や修正をすることができません。

また、テキストファイルをバイナリエディタで開くこともできますが、テキストエディタと比べて特に大きな効果はありません。バイナリエディタでも大抵は別枠で ASCII やマルチバイト文字コード (Shift-JIS や UTF-8) も一緒に表示されます。stirling の場合は右側に表示されています。

先ほどの .docx ファイルをバイナリエディタ (Stirling) で開いた時の例を以下に示します。

一般的には「実行可能ではないバイナリファイル」は専用のアプリケーションが存在し、専用のアプリケーションがそのファイルを開き、そして人間に分かりやすい形式 (ここではテキスト形式への変換はもちろん、マトリクス表などの表示を含む) に変換して表示してくれます。

バイナリ=exe?OSでの取り扱い

文脈によっては「実行可能ファイル」(.exe など) のことをバイナリと呼ぶことがあります。

例えば Linux では /bin というフォルダに ls や cat などのコマンド (実行可能ファイル) が保存されていますが、bin というのはバイナリ (binary) を意味しています。

OS は「実行可能ファイル」を実行 (例えば Windows なら .exe のファイルをダブルクリック) するとそれをプログラムとしてメモリに展開します。

一方、Windows にて hoge.txt というテキストファイルをダブルクリックするとメモ帳 (notepad.exe) がプログラムとしてメモリに展開され、そのプログラムが hoge.txt を読み込み、その中身を表示します。

つまり .txt はメモ帳で開く、.xlsx はエクセルで開く, .html はブラウザで開く、といった定義です。

なお、この関連付けは Windows の「設定」の「既定のアプリ」の下部にある「ファイルの種類ごとに既定のアプリを選ぶ」にて設定されています。

ソースコードとスクリプト

プログラム言語のソースコードやスクリプト言語のスクリプトは、一般に ASCII コードで書かれます。これはプログラムやスクリプトを作成したり扱うのが人間だからです。人間が理解しやすいように ASCII コードが使われます。

SenseTalkによるバイナリデータ操作

if file "バイナリデータとは monet.png" as data is equal to oldData as data then .

as data 演算子を使用すると、普通は asData 関数を使用するよりも読みやすく自然な形になりますが、それ以外に機能面での違いはありません。

バイトチャンク

byte チャンク型は、SenseTalkのチャンク式を拡張したもので、チャンク式が提供する柔軟性のすべてをバイナリデータの扱いにおいて実現します。 byte チャンク型を使うと、データ値の中の1バイトまたはバイト範囲にアクセスすることができます。

put byte 2 of myData --

put bytes 3 to 4 of myData --

put the last 3 bytes of myData --

put into bytes 2 to 5 of myData --

put after byte 2 of myData --

delete the first 2 bytes of myData --

バイト番号 of データソース

bytes 始めのバイト バイナリデータとは to 終わりのバイト of データソース

byteチャンク式は、その直接的な文脈で常にデータとして扱われます(したがって as data の指定を付ける必要ありません)。 データソース をデータとして指定する必要はありません。データでない値は自動的にデータに変換されてから、取得対象のバイトが抽出されます。

バイナリデータファイル

データファイルへの簡単なアクセス

テキストファイルへのアクセス方法で最も簡単なのは、ファイルをコンテナとして直接扱うやり方です。バイナリデータファイルについても、ファイルのバイトを直接読み取るよう示す バイナリデータとは as data 演算子を用いるだけで、同様に扱うことができます。

put file "horse.tiff" as data into tiffData -- ファイル全体を一度に読み取ります

put rawBudgetData as data into file "budget.dat" -- データファイルに書き込みます

リモートURLファイルへのアクセス

URLを通じたリモートファイルへのアクセスは、ローカルファイルと全く同じように行うことができます。必要なのは、 file と指定する代わりに URL と指定し、ファイルパスの代わりにURLを与え、 as data を使うだけです。

put URL "http://some.company.com/horse.jpg" as data into jpgData

put file "budget.dat" as data into URL バイナリデータとは remoteBudgetFileURL

バイナリファイルへの完全なアクセス

より複雑な処理が必要なときには、標準的なfileコマンド一式( open file 、 read from file 、 write to file 、 seek in file および close バイナリデータとは file )を使用することができます。 read および write コマンドでは、バイナリデータ内の数値をさまざまなフォーマットで読み書きするための特別なオプションが利用可能です。ファイルやフォルダとのやり取りやソケット、プロセスおよびストリームの入出力に出てくる read および write コマンドの説明をご覧ください。

これらの数値データ型だけでなく、 byte チャンク型でも、 read コマンドとの併用によって指定の数のバイトをデータとして読み取ることができます。

read 20 bytes from file "singer.tiff" into formatData

開いているファイルの現在の位置にバイナリデータを書き込むときは、単に as data を指定します。

write orbitalCoordinates as data to file jupiter

書き込まれる値が既にデータであることが明確な場合(データ値から選択したバイトを書き込むときなど)、 as data 演算子は省略可能です。

write bytes 1 to 16 of temperatureRecord to file saturn

データ変換

バイナリデータ値は、必要があればいつでも自動的にテキストへ変換されます。ファイルに値を書き込むときや値を表示するときなど、この変換が行われそうな文脈は数多く存在します。値を一時的にデータとして扱わせ、この変換を起こさないようにするには、 as data 演算子を使用します。

put encryptedPassword as data into file "key"

put "バイナリデータとは Secret" as data

文字列の値がテキストからデータに変換されるときは必ず、 the defaultStringEncoding グローバルプロパティの現在の設定によって管理されている方法で各文字がバイナリデータにエンコードされます。逆方向(データからテキスト)の変換を管理しているのは、 the defaultDataFormat グローバルプロパティです。

base64Encode、base64Decode関数、as base64演算子

base64Encode() 関数は、バイナリデータをbase64テキスト表現に変換します。この関数は、 as base64 演算子を使って呼び出すことも可能です。 base64Decode() 関数は、base64形式のテキストを取り、それを変換してバイナリデータに戻します。

これらの関数や as base64 バイナリデータとは 演算子は、バイナリデータの base64 形式への/からの変換時に使用します。 base64 は、MIME経由のEメールを含む数々のアプリケーションや、XMLの複雑なデータの格納において一般的に使われる標準形式です。

put base64Encode(sourceData) into file "/tmp/datastore"

put base64Decode of file "/tmp/datastore" into restoredData

if file "/tmp/datastore" is equal to oldData as base64 then .

構文:
base64Encode(値)
base64Decode(値)
値 as base64

as base64 演算子を使用すると、 バイナリデータとは base64Encode 関数を使用するよりも読みやすく自然な形になることが多いですが、それ以外に機能面での違いはありません。

This topic was last updated on 8月 18, 2021 , at 01:37:47 午後 .

Eggplantsoftware.com | Documentation Home | User Forums | Support バイナリデータとは | Copyright © 2022 Eggplant

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

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 ヘッダセットしてはならず、この情報はストリームから自動的に取得されます。

関連記事

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

コメント

コメントする

目次
閉じる