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

ほとんどのSenseTalkスクリプトで扱うのはテキストや数値形式のデータで、時には日付やカラーといったその他の型の値も扱います。必要であれば、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 fileread from filewrite to fileseek 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...

技術トピック

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

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

 

This topic was last updated on 2月 01, 2019, at 11:13:23 午前.

Eggplant icon Eggplant.io | Documentation Home | User Forums | Support | Copyright © 2019 Eggplant