Convert-Base32
view release on metacpan or search on metacpan
lib/Convert/Base32.pm view on Meta::CPAN
$char2bits[ ord lc $sym ] = $bin;
$char2bits[ ord uc $sym ] = $bin;
do {
$bits2char{$bin} = $sym;
} while $bin =~ s/(.+)0\z/$1/s;
}
sub encode_base32_pre58($) {
length($_[0]) == bytes::length($_[0])
or Carp::croak('Data contains non-bytes');
my $str = unpack('B*', $_[0]);
if (length($str) < 8*1024) {
return join '', @bits2char{ $str =~ /.{1,5}/g };
} else {
# Slower, but uses less memory
$str =~ s/(.{5})/$bits2char{$1}/sg;
return $str;
}
}
sub encode_base32_perl58($) {
$_[0] =~ tr/\x00-\xFF//c
and Carp::croak('Data contains non-bytes');
my $str = unpack('B*', $_[0]);
if (length($str) < 8*1024) {
return join '', @bits2char{ unpack '(a5)*', $str };
} else {
# Slower, but uses less memory
$str =~ s/(.{5})/$bits2char{$1}/sg;
return $str;
}
}
sub decode_base32_pre58($) {
( length($_[0]) != bytes::length($_[0]) || $_[0] =~ tr/a-zA-Z2-7//c )
and Carp::croak('Data contains non-base32 characters');
my $str;
if (length($_[0]) < 8*1024) {
$str = join '', @char2bits[ unpack 'C*', $_[0] ];
} else {
# Slower, but uses less memory
($str = $_[0]) =~ s/(.)/$char2bits[ord($1)]/sg;
}
lib/Convert/Base32.pm view on Meta::CPAN
my $padding = length($str) % 8;
$padding < 5
or Carp::croak('Length of data invalid');
$str =~ s/0{$padding}\z//
or Carp::croak('Padding bits at the end of output buffer are not all zero');
return pack('B*', $str);
}
sub decode_base32_perl58($) {
$_[0] =~ tr/a-zA-Z2-7//c
and Carp::croak('Data contains non-base32 characters');
my $str;
if (length($_[0]) < 8*1024) {
$str = join '', @char2bits[ unpack 'C*', $_[0] ];
} else {
# Slower, but uses less memory
($str = $_[0]) =~ s/(.)/$char2bits[ord($1)]/sg;
}
( run in 0.294 second using v1.01-cache-2.11-cpan-1f129e94a17 )