# my @input = ( 0xC1, 0xB3, 0xE0, 0x81, ... ); my @input = do { local $/; unpack "C*", pack "H*", <> =~ s/\s//gr }; #### # my $input = "\xC1\xB3\xE0\x81..."; my $input = do { local $/; pack "H*", <> =~ s/\s//gr }; #### (?: [\x00-\x7F] | [\xC0-\xDF][\x80-\xBF] | [\xE0-\xEF][\x80-\xBF]{2} | ... ) #### my @bytes = unpack 'C*', $encoded_value; if (@bytes == 1) { push @output, $bytes[0]; } elsif (@bytes == 2) { push @output, (( $bytes[0] & 0x1F ) << 6 ) | ( $bytes[0] & 0x3F ); } elsif (@bytes == 3) { push @output, (( $bytes[0] & 0x0F ) << 12 ) | (( $bytes[0] & 0x3F ) << 6 ) | ( $bytes[0] & 0x3F ); } ... #### say join " ", map sprintf("%X", $_), @output; #### # Separated by "." instead of spaces. say sprintf "%vX", pack "W*", @output;