SenseTalkによるバイナリデータ操作
データの値
生データは、山括弧<>で囲んだ1バイトデータ当たり1組の16進数を用いてスクリプト内で直接表現することができます。
put <00> into nullByte -- 値ゼロの1バイト
put <48656c6c6f> into secretMessage -- 5バイトデータ
putコマンドをput beforeおよびput afterの形で使うと、既に存在する値の前か後に追加のバイナリデータを挿入することができます。
put <20467269 656e6421> after secretMessage -- 末尾にデータを追加します
2つのバイナリデータ値が分かっていて、その等価性を比較する場合、両者が持つバイナリコンテンツが全く同じであることを確認するために、バイト同士での比較を行います。
put secretMessage is <48656c6c6f20467269656e6421> -- true
技術トピック |
構文: < 16進数データ > |
16進数データは、0~9およびA~Fから成る16進数が偶数個ある構成でなければなりません。読みやすさのため、スペースを使って連続部分を分割しても構いません。 |
asData関数、as data演算子
振る舞い
asData()関数は、ほとんどの場合as data演算子を使って呼び出され、その振る舞いとしては値をバイナリ表現に変換します。
使用場面
asData()関数やas data演算子は、SenseTalkに値をバイナリデータとして扱うよう指示したいときに使用します。これが特に便利なのはファイルやURLを生のバイナリ形式で読み書きする場合(本章後半の説明を参照)ですが、バイナリ形式で値を扱ったり表示したする目的でいつ使用しても構いません。
2つのバイナリデータ値が分かっていて、その等価性を比較する場合、両者が持つバイナリコンテンツが全く同じであることを確認するために、バイト同士での比較を行います。こうしたバイナリ比較を確実に行うには、as dataを使用します。
例
put "abcdefg" as data -- <61626364 656667>
put file "picture.jpg" as data into rawImageData -- ファイルの中身をデータとして読み取ります
if file "monet.png" as data is equal to oldData as data then...
技術トピック |
構文: asData(値) 値 as data |
as data演算子を使用すると、普通はasData関数を使用するよりも読みやすく自然な形になりますが、それ以外に機能面での違いはありません。 |
バイトチャンク
byteチャンク型は、SenseTalkのチャンク式を拡張したもので、チャンク式が提供する柔軟性のすべてをバイナリデータの扱いにおいて実現します。byteチャンク型を使うと、データ値の中の1バイトまたはバイト範囲にアクセスすることができます。
put <010203040506> into myData
put byte 2 of myData -- <02>
put bytes 3 to 4 of myData -- <0304>
put the last 3 bytes of myData -- <040506>
byteチャンク型も、他のチャンク型と同様にコンテナであるため、データを変更することができます。
put <010203040506> into myData -- <010203040506>
put <AABB> into bytes 2 to 5 of myData -- <01AABB06>
put <77>after byte 2 of myData -- <01AA77BB06>
delete the first 2 bytes of myData -- <77BB06>
技術トピック |
構文: byte バイト番号 of データソース bytes 始めのバイト to 終わりのバイト of データソース |
byteチャンク式は、その直接的な文脈で常にデータとして扱われます(したがってas dataの指定を付ける必要ありません)。データソースをデータとして指定する必要はありません。データでない値は自動的にデータに変換されてから、取得対象のバイトが抽出されます。 |
バイナリデータファイル
バイナリ(非テキスト)ファイル内のデータの読み書きは、スクリプトにおいて最も重要なバイナリデータ使用場面の1つです。バイナリデータファイルを扱う方法は、ニーズに応じていくつか用意されています。
データファイルへの簡単なアクセス
テキストファイルへのアクセス方法で最も簡単なのは、ファイルをコンテナとして直接扱うやり方です。バイナリデータファイルについても、ファイルのバイトを直接読み取るよう示す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
-- バイナリ形式の<53656372 6574>を表示します
文字列の値がテキストからデータに変換されるときは必ず、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...
技術トピック |
構文:
|
as base64演算子を使用すると、base64Encode関数を使用するよりも読みやすく自然な形になることが多いですが、それ以外に機能面での違いはありません。 |