#!perl -w use strict; use Carp qw(croak); use Data::Dumper; sub get_value { my ($values) = @_; if ($$values =~ s/^([\x00-\x7F]|[\x80-\xBF].|[\xC0-\xFF]..)//) { my $tmp = substr "\0\0\0$1", -4; # maybe sprintf or pack would be faster... my $result = unpack 'N', $tmp; if (length $1 == 3) { $result &= 0b00111111_11111111_11111111; } elsif (length $1 == 2) { $result &= 0b00111111_11111111; }; return $result; } else { croak "Invalid wide character in input: %08b", substr $$values,0,1; }; }; my @values = (0b01010101, # 85 0b10101010, 0b10101010, # 10922 0b11001100, 0b11001100, 0b11001100, # 838860 0b00000000, # 0 as another simplicistic testcase ); my $values = join "", map { chr } @values; while (length $values) { print get_value( \$values ),"\n"; };