#!/usr/bin/perl -w use strict; sub EncodeBytes($) { my ($code) = @_; if( $code <= (1 << 7) - 1 ) { return ($code); } if( $code <= (1 << (5 + 6)) - 1 ) { return (0xc0 | (($code >> 6) & 0x1f), 0x80 | ($code & 0x3f)); } if( $code <= (1 << (4 + 6 + 6)) - 1 ) { return (0xe0 | (($code >> 12) & 0x0f), 0x80 | (($code >> 6) & 0x3f), 0x80 | ($code & 0x3f)); } return (0xf0 | (($code >> 18) & 0x07), 0x80 | (($code >> 12) & 0x3f), 0x80 | (($code >> 6) & 0x3f), 0x80 | ($code & 0x3f)); } foreach my $a (@ARGV) { if( $a =~ /^(?:0[xX])?[0-9a-fA-F]+$/ ) { my @bytes = EncodeBytes(hex($a)); print "$a:"; printf ' %02x', $_ foreach @bytes; print "\n"; } else { die "Expected hexadecimal value: $a\n"; } }