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

I'm running:

This is perl, v5.8.5 built for x86_64-linux-thread-multi

The translation program I'm running was written in C and is only compiled for win32. I'd be more than happy to post it along with the sample hex message if you want to look at it.

So my reasons for looking further into this are 2-fold: 1) Port it to *nix as this is my native operating environment as well as to be able to run it on as a cronjob and 2) learning about data types and how they are represented on the machine.

njcodewarrior

Replies are listed 'Best First'.
Re^5: Decoding binary information
by liverpole (Monsignor) on Feb 10, 2007 at 18:43 UTC
    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$..$/