momo33 has asked for the wisdom of the Perl Monks concerning the following question:

Hello Perlmonks,

From an encrypted string I need to decode a 2-byte part, 16 bit. The 16 bit represent a date (year, month, day). The decoding is done using Crypt::DES. The 2-byte part is extracted with $packed_d = substr($packed_d,0,2); I then need the first 7 bits converted into a year, 4 bits for the month, and 5 bits for the day.

My code for selection of the bits does not work. The bitwise-& with my hex and packed_d always returns 0x00. In the example I construct a packed_d that I found in the data. Can someone tell me why "$packed_d & 0xFE00" always returns 0x00 ? (I replaced 0xFE00 with 0xFFFF and it still returns 0x00)

Thank you.

# raw contains the decrypted data my ($p1,$p1,$p3,$packed_d)=split(/\000/,$raw,4); $packed_d = substr($packed_d,0,2); #cut padding # temporary construction of packed_d my( $packed_d ) = pack( 'H4', d262 ); my $y = (($packed_d & 0xFE00) >> 9) + 4; my $m = (($packed_d & 0x01E0) >> 5) - 1; my $d = ($packed_d & 0x001F);

Replies are listed 'Best First'.
Re: selecting and converting a bitstring
by BrowserUk (Patriarch) on Nov 13, 2015 at 13:00 UTC

    You've a couple of mistakes:

    1. When packing your temp value, you've written d262, when you should have used 'd262'. (use warnings would have caught that.)
    2. If you want to perform math operations on your value, you need to unpack it to a number: See the unpack below.
    $p = unpack 'v', pack 'H4', 'd262';; print $p;; 25298 $y = (($p & 0xFE00) >> 9) + 4;; $m = (($p & 0x01E0) >> 5) - 1;; $d = ($p & 0x001F);; print join '/', $y, $m, $d;; 53/5/18

    Note you might need to use 'n' instead of 'v' for the unpacking depending upon the endianess of the data:

    $p = unpack 'n', pack 'H4', 'd262';; print $p;; 53858 $y = (($p & 0xFE00) >> 9) + 4;; $m = (($p & 0x01E0) >> 5) - 1;; $d = ($p & 0x001F);; print join '/', $y, $m, $d;; 109/2/2

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Thank you! You explained the problem clearly and I got it working.