Converting Between Octal and Hexadecimal
Problem
You want to convert a string (e.g.,
"0x55" or "0755") containing an
octal or hexadecimal number to the correct number.
Perl only understands octal and hexadecimal numbers when they occur as literals in your programs. If they are obtained by reading from files or supplied as command-line arguments, no automatic conversion takes place.
Solution
Use Perl’s oct and hex
functions:
$number = hex($hexadecimal); # hexadecimal $number = oct($octal); # octal
Discussion
The oct function converts octal numbers with or
without the leading "0": "0350"
or "350". In fact, it even converts hexadecimal
("0x350") numbers if they have a leading
"0x". The hex function only
converts hexadecimal numbers, with or without a leading
"0x": "0x255",
"3A", "ff", or
"deadbeef". (Letters may be in upper- or
lowercase.)
Here’s an example that accepts a number in either decimal,
octal, or hex, and prints that number in all three bases. It uses the
oct function to convert from octal and hexadecimal
if the input began with a 0. It then uses printf
to convert back into hex, octal, and decimal as needed.
print "Gimme a number in decimal, octal, or hex: "; $num = <STDIN>; chomp $num; exit unless defined $num; $num = oct($num) if $num =~ /^0/; # does both oct and hex printf "%d %x %o\n", $num, $num, $num;
The following code converts Unix file permissions. They’re
always given in octal, so we use oct instead of
hex.
print "Enter file permission in octal: "; $permissions ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access