メインコンテンツまでスキップ

SenseTalkを使用したバイナリデータの操作

ほとんどのSenseTalkスクリプトは、テキストと数字の形でデータを操作し、場合によっては日付や色などの他の種類の値を操作します。必要に応じて、SenseTalkはバイナリ形式のデータ(コンピュータに保存される生のビットとバイト)も扱うことができます。

データ値

生のデータは、データの各バイトに対して16進数のペアを使って、スクリプトで直接表現することができます。これらは、"<" と ">" の間に入れます。

put <00> into nullByte -- 値がゼロの単一バイト
put <48656c6c6f> into secretMessage -- 5バイトのデータ

put beforeput 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を使ってそのようなバイナリ比較が行われることを確認します。

Syntax:

asData( aValue )

aValue as data

as data 演算子は通常、asData関数よりも読みやすく自然に使用することができますが、機能的には同一です。

例:

put "abcdefg" as data -- &lt;61626364 656667&gt;
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>

Syntax:

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を通じてリモートファイルにアクセスするのは、ローカルファイルと全く同じように動作します。単にURLfileの代わりに指定し、ファイルパスの代わりにURLを提供し、as dataを使用します:

URL "http://some.company.com/horse.jpg"をデータとしてjpgDataに配置する
ファイル "budget.dat"をデータとしてURL remoteBudgetFileURLに配置する

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

より高度な処理が必要な場合、open fileread from filewrite to fileseek in fileclose fileを含む標準的なファイルコマンドセットを使用することができます。readwriteコマンドは、様々な形式でバイナリデータ内の数値を読み書きするための特別なオプションを持っています。readwriteコマンドの説明を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に複雑なデータを保存するなど、多数のアプリケーションで一般的に使用される標準形式です。

Syntax:

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