in reply to Re: Re: Hex to decimal
in thread Hex to decimal

D:\Perl\dl>perl -e "print unpack('s',pack 's', hex('ffaa'))" -86
This:

--
I'd like to be able to assign to an luser

Replies are listed 'Best First'.
(tye)Re2: Hex to decimal
by tye (Sage) on Apr 26, 2001 at 01:40 UTC

    Note that pack/unpack were not useful in converting from hex to decimal (unlike most people seem to think) but were used here to convert from unsiged to signed-short.

    Also, sprintf isn't useful for converting from hex to decimal but is the proper choice for going the other direction.

    Update: Ah, thanks merlyn; I didn't think of that way to use pack/unpack to convert hex to decimal. To convert without having to worry about little-/big-endian issues gets rather complicated when using pack/unpack and signed values:

    my $hex= "FFAA"; my $signed= unpack "s", pack "S", unpack "v", pack "H*", $hex;
    and it gets even more complicated if you want to handle different numbers of hex digits:
    my $hex= "ABC"; my $unsigned= unpack "V", pack "h*", "".reverse "00000000".$hex; my $signed= unpack "l", pack "L", unpack "V", pack "h*", "".reverse( ( $hex=~/^[89a-f]/i ? "F" : "0" ) x 8 . $hex );

            - tye (but my friends call me "Tye")
Re: Re: Re: Re: Hex to decimal
by merlyn (Sage) on Apr 26, 2001 at 01:46 UTC
    You can skip the hex step with:
    perl -e 'print unpack "s", pack "H*", "ffaa"'
    If that's wrong on your system, it's an endian problem. {grin} So you can also try:
    print unpack "s", pack "h*", scalar reverse "ffaa";
    which does print -86 on my machine.

    -- Randal L. Schwartz, Perl hacker