made it a bit faster. You need Tie::CharArray, but it is worth the speedup.
use strict;
use warnings;
use Tie::CharArray;
use Compress::Zlib;
++$|;
my $filename = $ARGV[0] || die "usage: need a filename";
if ( ! -f "$filename" ) {
print STDERR "couldn't open: $filename\n";
exit(-1);
}
open IN, $filename or die $!;
binmode IN;
read IN, my $stringdata, 1e8;
tie my @data, 'Tie::CharArray', $stringdata;
my $piecenum=0;
my $progress = progress(length $stringdata);
my $piecedata;
for (0..length($stringdata)-1) {
$progress->($_);
shift(@data);
$data[0] = "\x78";
$data[1] = "\x9c";
( $piecedata = uncompress($stringdata)) || next;
print "\nFound piece at $_\n";
open OUT, sprintf('>piece_%03d.txt', $piecenum++) or die $!; binmo
+de OUT;
print OUT $piecedata ^ chr(0xAA) x length $piecedata;
}
sub progress {
my $max = $_[0];
my $last = 0;
return sub { print $last = int(100*$_[0]/$max), "%... " if $last !
+= int(100*$_[0]/$max) };
}
|