SenseTalkを使用したバイナリデータの操作
ほとんどのSenseTalkスクリプトは、テキストと数字の形でデータを操作し、場合によっては日付や色などの他の種類の値を操作します。必要に応じて、SenseTalkはバイナリ形式のデータ(コンピュータに保存される生のビットとバイト)も扱うことができます。
データ値
生のデータは、データの各バイトに対して16進数のペアを使って、スクリ プトで直接表現することができます。これらは、< と > の間に入れます。
put <00> into nullByte -- 値がゼロの単一バイト
put <48656c6c6f> into secretMessage -- 5バイトのデータ
put before
と put after
の形式の put
コマンドは、既存の値の前または後に追加のバイナリデータを挿入するために使用できます。
put <20467269 656e6421> after secretMessage -- 追加のデータを追加する
二つの既知のバイナリデータ値が等しさを比較されるとき、それらはバイトごとに比較され、全く同じバイナリ内容を持っていることが確認されます。
put secretMessage is <48656c6c6f20467269656e6421> -- true
Syntax: *< hexadecimalData >
_hexadecimalData_は、0から9、AからFの16進数の数値で構成されている必要があります。読みやすさのために、空白を使って列を区切ることができます。
AsData
関数、 As Data
演算子
動作: asData
関数は、最もよく as data
演算子を使用して呼び出され、任意の値をそのバイナリ表現に変換します。
asData
関数または as data
演算子を使用するのは、SenseTalkに値をバイナリデータとして扱うよう指示したいときです。これは、ファイルやURLをその生のバイナリ形式で読み書きする場合(この章の後半で説明)に特に便利ですが、いつでもバイナリ形式で値を扱ったり表示したりするために使用することもできます。
二つの既知のバイナリデータ値が等しさを比較されるとき、それらはバイトごとに比較され、全く同じバイナリ内容を持っていることが確認されます。as data
を使ってそのようなバイナリ比較が行われることを確認します。
asData( aValue )
aValue as data
as data
演算子は通常、asData
関数よりも読みやすく自然に使用することができますが、機能的には同一です。
例:
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
//Do something
end if
バイトのチャンク
byte
チャンク型は、SenseTalkのチャンク表現を拡張し、バイナリデータを扱う際にチャンク表現が提供する全ての柔軟性を提供 します。byte
チャンク型は、データ値内の単一のバイトまたはバイトの範囲にアクセスするために使用できます:
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>
他のチャンク型と同様に、バイトチャンクはコンテナであるため、データを変更するために使用することができます:
put <010203040506> into myData -- <010203040506>
put <AABB> into bytes 2 to 5 of myData -- <01AABB06>
myDataのバイト2の後に<77>を配置する -- <01AA77BB06>
myDataの最初の2バイトを削除する -- <77BB06>
byte byteNumber of dataSource
bytes firstByte to lastByte of dataSource
バイトチャンク表現は常にその即時のコンテキストでデータとして扱われます(それゆえにそれと共にas data
を指定する必要はありません)。_dataSource_はデータとして指定する必要はありません。非データ値は、要求されたバイトが抽出 される前に自動的にデータに変換されます。
バイトチャンクの削除
deleteコマンドはまた、バイナリデータ値の中からバイトチャンクを削除するために使用することができます。これは、削除されたバイトの数によってデータ全体のサイズを減少させます。
例:
myDataのバイト5を削除する
myDataの最後の2バイトを削除する
myDataのバイト100から199までを削除する
バ イナリデータファイル
スクリプト内でのバイナリデータの最も重要な用途の一つは、バイナリ(非テキスト)ファイルのデータを読み書きするときです。バイナリデータファイルを操作する方法はいくつかあり、それはあなたのニーズによります。
シンプルなデータファイルアクセス
テキストファイルにアクセスする最も簡単な方法は、ファイルを直接コンテナとして扱うことです。同じアプローチはバイナリデータファイルに対しても機能し、単純にas data
演算子を使用してファイルのバイトを直接読むべきであることを示します:
ファイル "horse.tiff"をデータとしてtiffDataに配置する -- 一度にファイル全体を読む
同様に、データをファイルに書き込むこともできます:
rawBudgetDataをデータとしてファイル "budget.dat"に配置する -- データファイルを書き込む
リモートURLファイルアクセス
URLを通じてリモートファイルにアクセスするのは、ローカルファイルと全く同じように動作します。単にURL
をfile
の代わりに指定し、ファイルパスの代わりにURLを提供し、as data
を使用します:
URL "http://some.company.com/horse.jpg"をデータとしてjpgDataに配置する
ファイル "budget.dat"をデータとしてURL remoteBudgetFileURLに配置する
完全なバイナリファイルアクセス
より高度な処理が必要な場合、open file
、read from file
、write to file
、seek in file
、close file
を含む標準的なファイルコマンドセットを使用することができます。read
とwrite
コマンドは、様々な形式でバイナリデータ内の数値を 読み書きするための特別なオプションを持っています。read
とwrite
コマンドの説明をFile and Folder InteractionおよびSocket, Process, and Stream Input and Outputで参照してください。
これらの数値データタイプに加えて、byte
チャンクタイプは、任意の数のバイトをデータとして読むためにread
コマンドと共に使用することができます:
ファイル "singer.tiff"から20バイトを読み取り、formatDataに配置する
現在の位置で開いたファイルにバイナリデータを書き込むには、単にas data
を指定します:
orbitalCoordinatesをデータとしてファイルjupiterに書き込む
書き込む値が特にすでにデータである場合、as data
演算子は省略できます。たとえば、データ値から選択されたバイトを書き込むとき:write bytes 1 to 16 of temperatureRecord to file saturn
データ変換
バイナリデータ値は必要に応じて自動的にテキストに変換されます。これが発生する多くのコンテキストがあります。これには、ファイルに値を書き込む場合や値が表示される場合が含まれます。値が一時的にデータとして扱われ、この変換を避けるために、as data
オペレーターを使用します:
encryptedPasswordをデータとしてファイル "key"に配置する -- ファイルにバイナリデータを書き込む
"Secret" as data -- バイナリ形式で表示:<53656372 6574>
文字列値がテキストからデータに変換されるとき、the defaultStringEncoding
グローバルプロパティの現在の設定が、各文字がバイナリデータにエンコードされる方法を制御するために使用されます。データからテキストへの変換は、the defaultDataFormat
グローバルプロパティによって制御されます。
Base64Encode
, Base64Decode
関数、as Base64
オペレーター
振る舞い: base64Encode
関数はバイナリデータをbase64テキスト表現に変換します。この関数はまた、as base64
オペレーターを使用して呼び出すこともできます。base64Decode
関数は、base64形式のテキストを取り、それをバイナリデータに戻します。
これらの関数またはas base64
オペレーターを使用して、バイナリデータをbase64
形式に変換したり、その逆をしたりします。Base64
は、MIMEを介した電子メールや、XMLに複雑なデータを保存するなど、多数のアプリケーションで一般的に使用される標準形式です。
base64Encode( aValue )
base64Decode( aValue )
aValue as base64
as base64
オペレーターは、base64Encode
関数よりも読みやすく自然に使用することが多いですが、機能的には完全に同一です。
例
base64Encode(sourceData)をファイル "/tmp/datastore"に配置する
ファイル "/tmp/datastore"のbase64DecodeをrestoredDataに配置する
if file "/tmp/datastore" is equal to oldData as base64 then
//何かをする
end if