SWF-File-0.20 > SWF::BinStream

名前

SWF::BinStream - バイナリストリームの読み書き

概要

  use SWF::BinStream;

  $read_stream = SWF::BinStream::Read->new($binary_data, \&adddata);
  $byte = $read_stream->get_UI8;
  $signedbyte = $read_stream->get_SI8;
  $string = $read_stream->get_string($length);
  $bits = $read_stream->get_bits($bitlength);
  ....

  sub adddata {
      if ($nextdata) {
      shift->add_stream($nextdata);
      } else {
      die "The stream ran short ";
      }
  }

  $write_stream = SWF::BinStream::Write->new;
  $write_stream->set_UI8($byte);
  $write_stream->set_SI8($signedbyte);
  $write_stream->set_string($string);
  $write_stream->set_bits($bits, $bitlength);
  $binary_data=$write_stream->flush_stream;
  ....

説明

SWF::BinStreamモジュールは、バイト単位、ビット単位で読み書きできるバイナリストリームを提供します。SWFファイルのようなビット単位で圧縮されたファイルを扱うのに適しています。

SWF::BinStream::Read

読み込み用のストリームを提供します。まずストリームにデータを追加し、 バイト/ビット単位で読み出します。ストリーム内のデータがなくなると、 ユーザー定義のコールバックルーチンを呼び出します。 get_UI16, get_SI16, get_UI32, get_SI32は、数を VAXバイトオーダーで読み出します。 get_bits, get_sbitsは、MSBからLSBに向かってビット列を読み出します。 get_UI*, get_SI*, get_stringは、ビット読み込み途中のバイトがあれば 読み飛ばし、次のバイトから読み出します。 ビット読み込み途中の残りのビットを手動で読み飛ばすにはflush_bitsを使ってください。

メソッド

SWF::BinStream::Read->new( [ $initialdata, \&callback_in_short, $version ] )

読み込みストリームを作成します。省略可能な3つの引数を取ります。 最初の引数は、ストリームに最初に保持するデータです。 2番目の引数は、ストリーム中のデータがなくなったときに呼ばれるコールバックルーチンのリファレンスです。 コールバックルーチンは、ストリームオブジェクトと、必要なバイト数を引数に取ります。 3番目の引数はSWFのバージョン番号で、デフォルトは5です。いくつかのSWFタグはバージョンによって構成が変わるため、適切なバージョンを指定する必要があります。

$stream->Version

SWFバージョンを返します。

$stream->add_codec( $codec_name )

ストリームにデコーダを追加します。 今のところ、'Zlib'デコーダのみ使えます。

$stream->add_stream( $binary_data )

ストリームにデータを追加します。

$stream->Length

ストリームに残っているデータ長を返します。

$stream->tell

ストリームから何バイト読みとったかを返します。

$stream->get_string( $num )

文字列を$numバイト読みとります。

$stream->get_UI8

符号なし1バイト整数を読みとります。

$stream->get_SI8

符号つき1バイト整数を読みとります。

$stream->get_UI16

符号なし2バイト整数を読みとります。

$stream->get_SI16

符号つき2バイト整数を読みとります。

$stream->get_UI32

符号なし4バイト整数を読みとります。

$stream->get_SI32

符号つき4バイト整数を読みとります。

$stream->get_bits( $num )

$numビットの符号なし整数を読みとります。

$stream->get_sbits( $num )

$numビットの符号つき整数を読みとります。

$stream->flush_bits

ビット読み込み途中の1バイトの残りのビットを読み飛ばし、次のバイトから読むようにします。 ビット読み込み途中のバイトがなければ何もしません。

SWF::BinStream::Write

書き込みストリームを提供します。バイト/ビットデータを書き込み、結果の文字列を flush_streamを用いて取り出します。autoflushメソッドを使って、 自動的にストリーム内容を取り出してコールバックルーチンに渡すことができます。 set_UI16, set_SI16, set_UI32, set_SI32は、数をVAXバイトオーダーで ストリームに書き込みます。 set_bits, set_sbitsはビットをMSBからLSBに向かって書き込みます。 set_UI*, set_SI*, set_stringは、ビット書き込み途中のバイトの残りを0で埋め、 次のバイトから書き始めます。 手動でバイト境界から書き始める必要があるときはflush_bitsを使ってください。

メソッド

SWF::BinStream::Write->new([$version])

書き込みストリームを作成します。 省略可能な引数にSWFのバージョン番号をとります。デフォルトは5です。いくつかのSWFタグはバージョンによって構成が変わるため、適切なバージョンを指定する必要があります。

$stream->Version

SWFバージョンを返します。

$stream->add_codec( $codec_name )

ストリームのエンコーダを追加します。 今のところ'Zlib'エンコーダのみ使えます。

$stream->autoflush( $size, \&callback_when_flush )

$sizeバイト以上書き込んだらストリームをフラッシュしてコールバックルーチンを呼ぶよう、 ストリームに要求します。 コールバックルーチンは、ストリーム自身とフラッシュされたストリーム内容を引数に取ります。

$stream->flush_stream( [$size] )

ストリームをフラッシュして、フラッシュされた内容を返します。 $sizeを指定すると、$sizeバイトだけフラッシュして返します。 指定がなかったり、ストリーム内のデータが指定した数より少なければ、 ビット書き込み途中のバイトも含めてすべてのデータをフラッシュします。

$stream->flush_bits

ビット書き込み途中のバイトの残りのビットを0で埋め、次のバイトから書き込むようにします。

$stream->Length

ストリーム中に何バイト残っているかを返します。

$stream->tell

ストリームに何バイト書き込んだかを返します。

$stream->mark( [$key, [$obj]] )

現在のtell値を、$keyに関連づけて$objとともに保持します。 $keyのみを引数にして呼ぶと、スカラコンテキストでは$keyに関連づけられたtell値を、 リストコンテキストではtell値とオブジェクトのリストを、それぞれ返します。 引数なしで呼ぶと、マークのリスト( KEY1, [ TELL_NUMBER1, OBJ1 ], KEY2, ...)を 返します。

$stream->sub_stream

一時的なサブストリームを作成します。サブストリームをflush_streamすると、 データとマークを親のストリームに書き込んでサブストリームは解放されます。

例)様々な長さのデータを、その長さを書き込んでから書き込む。

  $sub_stream=$parent_stream->sub_stream;
  write_data($sub_stream);
  $parent_stream->set_UI32($sub_stream->Length);
  $sub_stream->flush_stream;
$stream->set_string( $str )

文字列を書き込みます。

$stream->set_UI8( $num )

符号なし1バイト整数を書き込みます。

$stream->set_SI8( $num )

符号つき1バイト整数を書き込みます。

$stream->set_UI16( $num )

符号なし2バイト整数を書き込みます。

$stream->set_SI16( $num )

符号つき2バイト整数を書き込みます。

$stream->set_UI32( $num )

符号なし4バイト整数を書き込みます。

$stream->set_SI32( $num )

符号つき4バイト整数を書き込みます。

$stream->set_bits( $num, $nbits )

$numを$nbits長の符号なし整数として書き込みます。

$stream->set_sbits( $num, $nbits )

$numを$nbits長の符号つき整数として書き込みます。

$stream->set_bits_list( $nbitsbit, @list )

@listを、符号なし整数のビットリストとして書き込みます。 @list中の数を表現できる最小のビット数(nbits)を求め、それを $nbitsbit長の符号なし整数としてまず書き込みます。 その後、@listの数をそれぞれnbits長の符号なし整数として書き込みます。

$stream->set_sbits_list( $nbitsbit, @list )

@listを、符号つき整数のビットリストとして書き込みます。 @list中の数を表現できる最小のビット数(nbits)を求め、それを $nbitsbit長の符号なし整数としてまず書き込みます。 その後、@listの数をそれぞれnbits長の符号つき整数として書き込みます。

UTILITY FUNCTIONS

&SWF::BinStream::Write::get_maxbits_of_bits_list( @list )
&SWF::BinStream::Write::get_maxbits_of_sbits_list( @list )

@list中の数を表現できる最小のビット数を求めます。 -_bits_listが符号なし用、-_sbits_listが符号つき用です。

コピーライト

Copyright 2000 Yasuhiro Sasama (ySas), <ysas@nmt.ne.jp>

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

翻訳者

笹間康弘 (ysas@nmt.ne.jp)