package Class::PINT::DataTypes::Bitmask; use strict; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(&_list2dec &_dec2bin &_bin2dec &_list2bin); use Math::BigInt; # use Math::BigIntFast; # faster uses Bit::Vector use constant LENGTH => 128; # 16 bytes !! sub _list2dec { my (@values) = @_; my $bitstring = ''; my $c = 0; my $cur_val = $values[$c++]; for ( my $i = 1; $i <= LENGTH; $i++ ) { my $val = "0"; # warn "val:$val\n"; if ($i == $cur_val) { $val = '1'; $cur_val = $values[$c++]; last unless (defined $cur_val); } $bitstring = $val.$bitstring; } warn "bitstring : $bitstring\n"; my $value = new Math::BigInt ("0b".substr("0" x LENGTH . $bitstring, - LENGTH )); warn "value : $value \n"; warn "value in binary : ", $value->as_bin(), "\n"; return $value; } sub _list2bin { my $value = _list2dec(@_); my $bin = $value->as_bin(); return $bin; } sub _bin2dec { my ($value,$size) = @_; $size ||= 32; my $bitstring = 0; if ($size > 32) { $bitstring = unpack("N", pack("B$size", substr("0" x 32 . $value, -32))); } else { my $bignum = $value = new Math::BigInt ("0b".substr("0" x LENGTH . $value, - LENGTH )); $bitstring = $bignum->as_int(); } return $bitstring; } sub _dec2bin { my ($value,$size) = @_; $size ||= 32; my $decstring = 0; if ($size > 32) { $decstring = unpack("B$size", pack("N", $value)); } else { my $bignum = $value = new Math::BigInt ("0b".substr("0" x LENGTH . $value, - LENGTH )); $decstring = $bignum->as_dec(); } return $decstring; }