Acme-Stegano
view release on metacpan or search on metacpan
Stegano/Stegano.pm view on Meta::CPAN
tie @file, 'Tie::File', $filename
or croak "Cant tie filename $filename: $!";
bless \@file, $class
}
sub insert
{
my ($self,$text) = @_;
my ($max_str,$max_cont,@map_letters) = (0,0);
my $binstr = unpack "b*", " $text"; # It must begin with 0
$_ > $max_str and $max_str = $_ for map { length } @$self;
while ($binstr =~ /((.)\2*)/g)
{
my $len = length($1);
$max_cont = $len if $len > $max_cont;
push(@map_letters,$len);
}
my @map_file = map { $max_str - length($_) > $max_cont } @$self;
for (my $i=0;$i<@$self;$i++)
{
$self->[$i] .= " " x shift(@map_letters)
if $map_file[$i] and @map_letters;
}
carp "Text is not enougth large to insert all chars" if @map_letters;
return ! @map_letters;
}
sub extract
{
my $self = shift;
my ($binstr,$i);
for my $line (@$self)
{
$binstr .= ++$i % 2 ? 0 x length($1) : 1 x length($1)
if $line =~ s/( +)$//
}
return substr(pack("b*", $binstr),1) # Delete our mark
}
1;
( run in 0.640 second using v1.01-cache-2.11-cpan-65fba6d93b7 )