my @masks = qw( 11011010101101010101010101101010 10110110011011001100110011011001 01110001111000111100001111000111 00001111111000000011111111000000 00000000000111111111111111000000 00000000000000000000000000111111 11111111111111111111111111111111 ); sub ecc { my ($hex) = @_; my $d = unpack 'B32', pack 'H8', $hex; my @r; push @r, unpack '%1B*', $_ & $d for @masks; $r[-1] = unpack '%1B*', $r[-1] . join "", @r[ 0 .. $#r - 1 ]; return join "", @r }