For Development HEAD DRAFTSearch (procedure/syntax/module):

12.1 binary.io - バイナリI/O

Module: binary.io

このモジュールは数値データを読み書きするバイナリ入出力用の基本手続きを提 供します。各データはポートあるいはユニフォームベクタ (ユニフォームベクタ参照)から読み込み、あるいはそれらへ書き出すことが できます。 構造をもつバイナリデータの入出力については、便利な packユーティリティがこのモジュールを使って実装されています (binary.pack - バイナリデータのパックを参照してください)。 スピードあるいはエンディアンの柔軟な制御などをやりたいときにこのモジュー ルが使えます。

バイナリのブロック入出力についてはユニフォームベクタを参照してくだ さい。

エンディアン

このモジュールのほとんどの手続はオプション引数としてendian引数を とります。これはbig-endianlittle-endianarm-little-endianのいずれかのシンボルでなければなりません。 エンディアン引数が省略された場合には、組込みパラメータdefault-endian の現在値が使われます (エンディアンネス参照)。 (read-u8の ような 8ビット入出力手続ではエンディアン引数は意味がありませんが、 一貫性のため受け入れるようにしてあります。)

ポートを用いたI/O

Function: read-u8 :optional port endian
Function: read-u16 :optional port endian
Function: read-u32 :optional port endian
Function: read-u64 :optional port endian

{binary.io} それぞれ指定したエンディアンでportから8、16、32、64ビット符号無 整数を読み込みます。portが省略された場合は、現在の入力ポートが使 われます。portが整数の読み込みが完了する前にEOFに到達してしまっ た場合にはEOFが返ります。

Function: read-s8 :optional port endian
Function: read-s16 :optional port endian
Function: read-s32 :optional port endian
Function: read-s64 :optional port endian

{binary.io} それぞれ指定したエンディアンでportから8、16、32、64ビット、2の補 数符号付き整数を読み込みます。portが省略された場合は、現在の入力 ポートが使われます。portが整数の読み込みが完了する前にEOFに到 達してしまった場合にはEOFが返ります。

Function: read-uint size :optional port endian
Function: read-sint size :optional port endian

{binary.io} さらに柔軟性が高く、sizeオクテットの符号無しあるいは符号付き整数 をportから指定のエンディアンで読み込みます。 portが整数の読み込みが完了する前にEOFに到 達してしまった場合にはEOFが返ります。

Function: read-ber-integer :optional port

{binary.io} X.209のBER圧縮形式整数を読み込みます。BER圧縮形式整数は128進符号無し整 数です。最上位桁が最初にきます。最下位桁のバイトをのぞき、すべてのバイ トの最上位ビットはオンになっています。

Function: write-u8 val :optional port endian
Function: write-u16 val :optional port endian
Function: write-u32 val :optional port endian
Function: write-u64 val :optional port endian

{binary.io} それぞれ指定したエンディアンでportへ 8、16、32、64ビット、符号無 し整数として表現されている非負整数valを書き出します。 valはそれぞれ指定したビット数の範囲で表現できる値でなければなり ません。portが省略された場合は、現在の出力ポートが使われます。

Function: write-s8 val :optional port endian
Function: write-s16 val :optional port endian
Function: write-s32 val :optional port endian
Function: write-s64 val :optional port endian

{binary.io} それぞれ指定したエンディアンでportへ 8、16、32、64ビット、2の補 数符号付き整数として表現されている整数valを書き出します。 valはそれぞれ指定したビット数の範囲で表現できる値でなければなり ません。portが省略された場合は、現在の出力ポートが使われます。

Function: write-uint size val :optional port endian
Function: write-sint size val :optional port endian

{binary.io} さらに柔軟性が高く、sizeオクテットの符号無しあるいは符号付き整数 valportへ、指定のエンディアンで書き出します。 portが省略された場合は、現在の出力ポートが使われます。

Function: write-ber-integer val :optional port

{binary.io} BER圧縮形式の非負整数valportへ書き出します。 BER圧縮形式については前述のread-ber-integerを見てください。

Function: read-f16 :optional port endian
Function: read-f32 :optional port endian
Function: read-f64 :optional port endian

{binary.io} それぞれ、16、32、64ビットの浮動小数点数を読み込みます。 32ビットはIEEE754単精度、64ビットは倍精度の浮動小数点数です。 16ビット浮動小数点数は、1ビットの符号、5ビットの指数、10ビットの仮数からなる、 HDRイメージフォーマット等に使われている形式です。

portが省略された場合には、 現在の入力ポートが使われます。portが数値の読み込みが完了する前に EOFに到達してしまった場合にはEOFが返ります。

Function: write-f16 val :optional port endian
Function: write-f32 val :optional port endian
Function: write-f64 val :optional port endian

{binary.io} 実数値valを、それぞれ16、32、64ビットの浮動小数点数として 書き出します。 portが省略された場合には、現在の出力ポートが使われます。

ユニフォームベクタを用いたI/O

以下のルーチンでは、引数 uv は任意の型のユニフォームベクタをとり えます。u8vector ではない場合には (uvector-alias <u8vector> uv) が呼ばれたのと同様の扱いになります。すなわち、 uvectorの内容を保持するメモリイメージから直接読み込まれます。pos 引数は当該のメモリ領域の最初からのバイト位置を指定するのに使います(こ れはユニフォームベクタの要素のサイズにかかわらず、つねにバイト位置です)。

Function: get-u8 uv pos :optional endian
Function: get-u16 uv pos :optional endian
Function: get-u32 uv pos :optional endian
Function: get-u64 uv pos :optional endian
Function: get-s8 uv pos :optional endian
Function: get-s16 uv pos :optional endian
Function: get-s32 uv pos :optional endian
Function: get-s64 uv pos :optional endian
Function: get-f16 uv pos :optional endian
Function: get-f32 uv pos :optional endian
Function: get-f64 uv pos :optional endian

{binary.io} ユニフォームベクタ uv のバイト位置 pos から指定したフォー マットで数値を読み込み、その数値を返します。指定した位置が当該ユニフォー ムベクタの内容のある範囲外を参照するものであった場合、エラーを示すシグ ナルがあがります。

Function: get-u16be uv pos
Function: get-u16le uv pos
Function: get-u32be uv pos
Function: get-u32le uv pos
Function: get-u64be uv pos
Function: get-u64le uv pos
Function: get-s16be uv pos
Function: get-s16le uv pos
Function: get-s32be uv pos
Function: get-s32le uv pos
Function: get-s64be uv pos
Function: get-s64le uv pos
Function: get-f16be uv pos
Function: get-f16le uv pos
Function: get-f32be uv pos
Function: get-f32le uv pos
Function: get-f64be uv pos
Function: get-f64le uv pos

{binary.io} これらは、get-* 手続のエンディアン(ビッグエンディアン be あるいはリトルエンディアン le)を指定した版です。スピードを要求 されるコードではオプション引数処理のオーバーヘッドを避けるためこちらを 使うのがいいでしょう。

Function: get-uint size uv pos :optional endian
Function: get-sint size uv pos :optional endian

{binary.io} ユニフォームベクタuvpos番目のオクテットからsizeオクテットを、 それぞれ符号無し、符号つき整数として読み取ります。

(get-uint 3 '#u8(1 2 3 4) 1 'big-endian)
  ⇒ 131884 ; #x020304

(get-sint 3 '#u9(1 2 3 #xff) 1 'little-endian)
  ⇒ -64766 ; sign extended #xff0302
Function: put-u8! uv pos val :optional endian
Function: put-u16! uv pos val :optional endian
Function: put-u32! uv pos val :optional endian
Function: put-u64! uv pos val :optional endian
Function: put-s8! uv pos val :optional endian
Function: put-s16! uv pos val :optional endian
Function: put-s32! uv pos val :optional endian
Function: put-s64! uv pos val :optional endian
Function: put-f16! uv pos val :optional endian
Function: put-f32! uv pos val :optional endian
Function: put-f64! uv pos val :optional endian

{binary.io} 数値 val をユニフォームベクタ uv のバイト位置 pos か ら指定されたフォーマットで書き出します。指定した位置が当該ユニフォーム ベクタの内容のある範囲外を参照するものであった場合、エラーを示すシグナ ルがあがります。

Function: put-u16be! uv pos val
Function: put-u16le! uv pos val
Function: put-u32be! uv pos val
Function: put-u32le! uv pos val
Function: put-u64be! uv pos val
Function: put-u64le! uv pos val
Function: put-s16be! uv pos val
Function: put-s16le! uv pos val
Function: put-s32be! uv pos val
Function: put-s32le! uv pos val
Function: put-s64be! uv pos val
Function: put-s64le! uv pos val
Function: put-f16be! uv pos val
Function: put-f16le! uv pos val
Function: put-f32be! uv pos val
Function: put-f32le! uv pos val
Function: put-f64be! uv pos val
Function: put-f64le! uv pos val

{binary.io} これらは、put-* 手続のエンディアン(ビッグエンディアン be あるいはリトルエンディアン le)を指定した版です。スピードを要求 されるコードではオプション引数処理のオーバーヘッドを避けるためこちらを 使うのがいいでしょう。

Function: put-uint! size uv pos val :optional endian
Function: put-sint! size uv pos val :optional endian

{binary.io} それぞれ符号無しまたは符号つき整数valを、 ユニフォームベクタuvpos番目のオクテットからsizeオクテット分に 書き込みます。

互換性への注

read-u8 などは read-binary-uint8 と呼ばれていたもので、 read-f32read-f64 はそれぞれ read-binary-floatread-binary-double と呼ばれていたものです。 これらの古い名前は後方互換のためいまのところサポートされていますが、使 用については非推奨とします。この変更は名前の短縮とユニフォームベクタと の一貫性維持のために行われました。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT