# 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;