Codebase list libcryptx-perl / 1e60383
faster string_from Karel Miko 10 years ago
1 changed file(s) with 11 addition(s) and 4 deletion(s). Raw diff Collapse all Expand all
4545 my ($self, $chars, $len) = @_;
4646
4747 $len = 20 unless defined $len;
48 return unless $len>0;
48 return unless $len > 0;
49 return unless length($chars) > 0;
4950
5051 my @ch = split(//, $chars);
51 my $max_index = scalar(@ch)-1;
52
52 my $max_index = $#ch;
53 return if $max_index > 65535;
54
5355 my $mask;
5456 for my $n (1..31) {
5557 $mask = (1<<$n) - 1;
5658 last if $mask >= $max_index;
5759 }
5860
61 my $upck = ($max_index > 255) ? "n*" : "C*";
62 my $l = $len * 2;
63
5964 my $rv = '';
65 my @r;
6066 while (length $rv < $len) {
61 my $i = $self->int32 & $mask;
67 @r = unpack($upck, $self->bytes($l)) if scalar @r == 0;
68 my $i = (shift @r) & $mask;
6269 next if $i > $max_index;
6370 $rv .= $ch[$i];
6471 }