in reply to Re: -1 from hex ffffffffffffffff ?
in thread -1 from hex ffffffffffffffff ?

That should be q> (big-endian byte order), not q (native byte order).

Furthermore, it would be better to pad out the hex number in case fewer than 16 digits are provided.

sub hex_to_signed_quad { return unpack 'q>', substr(('0'x16).$_[0], -16); }

Replies are listed 'Best First'.
Re^3: -1 from hex ffffffffffffffff ?
by almut (Canon) on Oct 02, 2009 at 17:24 UTC
    should be q> (big-endian byte order)

    Well, no one said in what order the ffffffffffffffff is to be interpreted, and in this special case of all bits being ones, it wouldn't make much of a difference anyway :)

      Representations of numbers are always big endian. The sole case to have little endian numbers I can remember encountering used giant red flags to avoid confusion since representation of numbers are always big endian.

      Update: I suppose the first statement may not apply where non-latin scripts are involved. (I bet the most significant digit is placed first in all languages.)

        Representations of numbers are always big endian.

        The OP said hex string, not hex number.

        To elaborate, lets take the decimal number 1000.  Depending on whether it's stored big- or little-endian (in memory, in a file, etc.), you could find it as the (2-byte) string 03e8, or e803 (written in hex), and you could convert it to the number 1000 using any of the following (where 'n' and 'v' stand for "unsigned 16-bit in big-endian order" and "unsigned 16-bit in little-endian order" respectively):

        print unpack('n', pack('H*', '03e8')), "\n"; # 1000 print unpack('v', reverse pack('H*', '03e8')), "\n"; # 1000 print unpack('v', pack('H*', 'e803')), "\n"; # 1000 print unpack('n', reverse pack('H*', 'e803')), "\n"; # 1000

        Whereas the correct usage of 'n' or 'v' in combination with reverse does matter here, it doesn't when you have the symmetric hex string 'ffff'. Any combination will do (in particular, it's irrelevant whether you use the big- or little-endian unpack pattern):

        print unpack('n', pack('H*', 'ffff')), "\n"; # 65535 print unpack('v', reverse pack('H*', 'ffff')), "\n"; # 65535 print unpack('v', pack('H*', 'ffff')), "\n"; # 65535 print unpack('n', reverse pack('H*', 'ffff')), "\n"; # 65535 print unpack('n', reverse pack('H*', 'ffff')), "\n"; # 65535 print unpack('v', pack('H*', 'ffff')), "\n"; # 65535 print unpack('v', reverse pack('H*', 'ffff')), "\n"; # 65535 print unpack('n', pack('H*', 'ffff')), "\n"; # 65535

        (think of half of the 'ffff' as big-endian, and the other half as little-endian — as with 03e8/e803 above)