in reply to BitStream revisited
How about:
package BitStream; use constant BUF_SIZE => 2048; use POSIX qw(ceil); sub new { die "Correct usage is BitStream->new(filename)" unless @_ == 2; my ($class,$filename) = @_; open my $fh,"<",$filename or die "Couldn't open $filename: $!"; read($fh,my $buffer,BUF_SIZE); my $self = { fh => $fh, buffer => $buffer, dead_start => 0 }; bless $self,$class; } sub get_bits { my ($self,$bits) = @_; no warnings "once"; return "" unless $bits+=0; # ok, make the buffer big enough to handle the request my $buf; $self->{'buffer'} .= $buf while length($self->{'buffer'}) * 8 + $sel +f->{'dead_start'} < $bits && read($self->{'fh'},$buf,BUF_SIZE); # figure out our end position within the buffer my $bytes = ceil(($bits + $self->{'dead_start'})/8); my $return_buf = unpack("B*",substr($self->{'buffer'},0,$bytes)); $return_buf = substr($return_buf,$self->{'dead_start'},$bits) unless + $return_buf eq ""; $self->{'dead_start'} = ($bits + $self->{'dead_start'}) % 8; $bytes-- if $self->{'dead_start'}; substr($self->{'buffer'},0,$bytes) = ""; return $return_buf; } "Give me liberty or at least the remote";
Of course, I must admit that I prefer bit twiddling over this.
|
|---|