Search code examples
bashshellperlpackunpack

Perl Pack Unpack on Shell Variable


Ultimately my goal is to convert a hexdump of data to the correct floating point value. I have set up my shell script to isolate the individual hex values I need to look at and arrange them in the correct order for a little Endian float conversion.

To simplify everything, I'll bypass the code I have managed to get working, and I'll start with:

rawHex=0x41000000
echo $(perl -e 'print unpack "f", pack "L", $ENV{rawHex}')

When I execute this code, the result is 0. However if I were to execute the code without attempting to pull the value of the shell variable:

echo $(perl -e 'print unpack "f", pack "L", 0x41000000')

The result is 8, which is what I am expecting.

I'd appreciate any help on how I can update my Perl expression to properly interpret the value of the shell variable. Thanks.


Solution

  • export rawHex=0x41000000
    perl -le'print unpack "f", pack "L", hex($ENV{rawHex})'
    

    As you discovered, your code isn't equivalent to the following:

    perl -e 'print unpack "f", pack "L", 0x41000000'
    

    Your code is equivalent to the following:

    perl -e 'print unpack "f", pack "L", "0x41000000"'
    

    Like "0x41000000", $ENV{rawHex} produces the string 0x41000000. On the other hand, 0x41000000 produces the number one billion, ninety million, five hundred nineteen thousand and forty.

    To convert the hex representation of a number into the number it represents, one uses hex. Simply replace $ENV{rawHex} with hex($ENV{rawHex}).

    export rawHex=0x41000000
    perl -le'print unpack "f", pack "L", hex($ENV{rawHex})'
    

    The -l causes a line feed to be added to the output so you don't need to use echo. Feel free to remove the l if you're not actually using echo

    Generating code (as suggested in the earlier answer) is a horrible practice.