How can I convert hex strings into numbers in Perl?

Viewed 59932

I recently wrote a script which parsed a text representation of a single binary byte month field.

(Don't ask :-{ )

After fiddling with sprintf for a while I gave up and did this;

our %months = qw / x01 1 
       x02 2
       x03 3 
       x04 4 
       x05 5 
       x06 6 
       x07 7 
       x08 8 
       x09 9 
       x0a 10 
       x0b 11 
       x0c 12 /;
...
my $month = $months{$text};

Which I get away with, because I'm only using 12 numbers, but is there a better way of doing this?

4 Answers

Here's another way that may be more practical for directly converting the hexadecimals contained in a string.

This make use of the /e (e for eval) regex modifier on s///.

Starting from this string:

$hello_world = "\\x48\\x65\\x6c\\x6c\\x6f\\x20\\x57\\x6f\\x72\\x6c\\x64";

Hexadecimals to characters :

print $hello_world =~ s/\\x([0-9a-fA-F]{2})/chr hex $1/gre;

Hexadecimals to decimal numbers :

print $hello_world =~ s/\\x([0-9a-fA-F]{2})/hex $1/gre;

Drop the /r modifier to substitute the string in-place.

One day I used a python script that did stuff with a binary file and I was stuck with a bytes literal (b'\x09\xff...') containing only hexadecimal digits. I managed to get back my bytes with a one-liner that was a variant of the above.

Related