NAME

SWF::BinStream - Read and write binary stream.

SYNOPSIS

  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;
  ....

DESCRIPTION

SWF::BinStream module provides a binary byte and bit data stream. It can handle bit-compressed data such as SWF file.

SWF::BinStream::Read

Provides a read stream. Add the binary data to the stream, and you get byte and bit data. The stream calls a user subroutine when the stream data runs short. get_UI16, get_SI16, get_UI32, and get_SI32 get a number in VAX byte order from the stream. get_bits and get_sbits get the bits from MSB to LSB. get_UI*, get_SI*, and get_string skip the remaining bits in the current byte and read data from the next byte. If you want to skip remaining bits manually, use flush_bits.

METHODS

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

Creates a read stream. It takes two optional arguments. The first arg is a binary string to set as initial data of the stream. The second is a reference of a subroutine which is called when the stream data runs short. The subroutine is called with two ARGS, the first is $stream itself, and the second is how many bytes wanted.

$stream->add_stream( $binary_data )

Adds binary data to the stream.

$stream->require( $num )

Requires to keep $num bytes data to the stream. Then you can get $num bytes from the stream without short.

$stream->Length

Returns how many bytes remain in the stream.

$stream->tell

Returns how many bytes have been read from the stream.

$stream->get_string( $num )

Returns $num bytes as a string.

$stream->get_UI8

Returns an unsigned byte number.

$stream->get_SI8

Returns a signed byte number.

$stream->get_UI16

Returns an unsigned word (2 bytes) number.

$stream->get_SI16

Returns a signed word (2 bytes) number.

$stream->get_UI32

Returns an unsigned double word (4 bytes) number.

$stream->get_SI32

Returns a signed double word (4 bytes) number.

$stream->get_bits( $num )

Returns the $num bit unsigned number.

$stream->get_sbits( $num )

Returns the $num bit signed number.

$stream->flush_bits

Skips the rest bits in the byte and aligned read pointer to the next byte. It does not anything when the read pointer already byte-aligned.

SWF::BinStream::Write

Provides a write stream. Write byte and bit data, then get the stream data as binary string using flush_stream. autoflush requests to the stream to automatically flush the stream and call a user subroutine. set_UI16, set_SI16, set_UI32, and set_SI32 write a number in VAX byte order to the stream. set_bits and set_sbits write the bits from MSB to LSB. set_UI*, set_SI*, and set_string set the rest bits in the last byte to 0 and write data to the next byte boundary. If you want to write bit data and align the write pointer to byte boundary, use flush_bits.

METHODS

SWF::BinStream::Write->new

Creates a write stream.

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

Requests to the stream to automatically flush the stream and call sub with the stream data when the stream size becomes larger than $size bytes.

$stream->flush_stream( [$size] )

Flushes the stream and returns the stream data. Call with $size, it returns $size bytes from the stream. When call without arg or with larger $size than the stream data size, it returns all data including the last bit data ( by calling flush_bits internally).

$stream->flush_bits

Sets the rest bits in the last byte to 0, and aligns write pointer to the next byte boundary.

$stream->Length

Returns how many bytes remain in the stream.

$stream->tell

Returns how many bytes have written.

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

Keeps current tell number with $key and $obj. When called without $obj, it returns tell number associated with $key and a list of tell number and object in scalar and list context, respectively. When called without any parameter, it returns mark list ( KEY1, [ TELL_NUMBER1, OBJ1 ], KEY2, [...).

$stream->sub_stream

Creates temporaly sub stream. When flush_stream the sub stream, it's data and marks are written to the parent stream and the sub stream is freed.

Ex. write various length of data following it's length.

$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 )

Writes string to the stream.

$stream->set_UI8( $num )

Writes $num as an unsigned byte.

$stream->set_SI8( $num )

Writes $num as a signed byte.

$stream->set_UI16( $num )

Writes $num as an unsigned word.

$stream->set_SI16( $num )

Writes $num as a signed word.

$stream->set_UI32( $num )

Writes $num as an unsigned double word.

$stream->set_SI32( $num )

Writes $num as an unsigned double word.

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

Write $num as $nbits length unsigned bit data.

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

Write $num as $nbits length signed bit data.

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

Makes @list as unsigned bit data list. It writes the maximal bit length of each @list (nbits) as $nbitsbit length unsigned bit data, and then writes each @list number as nbits length unsigned bit data.

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

Makes @list as signed bit data list. It writes the maximal bit length of each @list (nbits) as $nbitsbit length unsigned bit data, and then writes each @list number as nbits-length signed bit data.

UTILITY FUNCTIONS

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

Gets the necessary and sufficient bit length to represent the values of @list. -_bits_list is for unsigned values, and -_sbits_list is for signed.

COPYRIGHT

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.