in reply to Re^4: Decoding binary information
in thread Decoding binary information

Oh, well if you're looking at the values with a C program, that would explain why those with the high-order bit set are displaying as negative values. You did say the numbers were "3 byte signed integers".

If you need to convert to negative values, I think bart's suggestion below (the second one) is the best (most simple).  Just subtract 2 ** 24 from any values which are greater than or equal to 0x800000 (2 ** 23).

That would amend my original code to something like:

use strict; use warnings; my @values = ( "05F9AD", "F4EC9E", "0005" ); foreach my $value (@values) { my $decval = hex($value); ($decval >= 0x800000) and $decval -= 0x1000000; printf "Hex value 0x%08lx = %ld (decimal)\n", $decval, $decval; } __END__ # Output: Hex value 0x0005f9ad = 391597 (decimal) Hex value 0xfff4ec9e = -725858 (decimal) Hex value 0x00000005 = 5 (decimal)

s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/