in reply to perl bitology - breaking into bytes

The answer you are seeking is vec.

This snippet prints a bit string (as a string rather than a number as your number could be 128-bits which would move into the realms of floating point inaccuracies), consisting of the value of the 49th through 69th bits, of the 6, 543, 210th 128-bit chunk of a 100MB string.

open F, '<', 'e:\100MB' or die $!; binmode F; { local $/ = \(100*1024*1024); $data = <F> }; sub bits_of_chunk{ my( $chunk, $start, $end ) = @_; join'', map{ vec $data, $_, 1 } ($chunk * 16 * 8 + $start) .. ($chunk * 16 * 8 +$end); }; print bits_of_chunk( 6543210, 49, 69 ); 000000000000000000000

The bits are accessed directly from the 100MB string and are return very quickly.


Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"Think for yourself!" - Abigail
Hooray!

Replies are listed 'Best First'.
Re: Re: perl bitology - breaking into bytes
by spurperl (Priest) on Oct 21, 2003 at 06:13 UTC
    Thanks again for the insightful reply !

    I haven't looked onto vec() before for this problem, and no one turned my attention to it before you (it seems a quite forgotten feature of Perl, only acouple of mentions in the full index of the popular Perl books). It does seem like help for my problem, and I'll consider using it.

    Perhaps I'll eventually create a File::BitStream module, whichever way I'll choose to implement it.