http://qs321.pair.com?node_id=656344

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

Monks,

I have difficulties converting data on a binary format to decimal numbers related to this node. I suspect the number are encoded using a float. I'm able to see what the results should be using a third-party tool.

The number should perform as follows:

What kind of conversion of unpack trickery am I in search for?

A hexdump of the source file is available on my pad (relax it's only 192 bytes).

Update: It seems like this does the trick (updated as shown by Anonymous Monk):

# read number: 8 bytes, return decimal value sub getnumber { my $buffer = undef; my $num = read($FH, $buffer, 8); return unpack 'd*', reverse $buffer; }
Update: pfaut++ and Fletch++ for good advice to stubborn monk.
--
Andreas

Replies are listed 'Best First'.
Re: Binary to decimal conversion
by Anonymous Monk on Dec 11, 2007 at 10:19 UTC
    Too much joining :)
    return unpack 'd*', reverse $buffer;
      Hmm.. I'm surprised to see it works to reverse a scalar like that. read's 2nd argument is a SCALAR, and reverse's single argument is a LIST. What is it I do not understand?
      --
      Andreas

        From reverse

        reverse LIST
              In list context, returns a list value consisting of the ele-
              ments of LIST in the opposite order.  In scalar context, con-
              catenates the elements of LIST and returns a string value with
              all characters in the opposite order.
        
        90% of every Perl application is already written.
        dragonchild
Re: Binary to decimal conversion
by Anonymous Monk on Dec 11, 2007 at 09:24 UTC
    // read number function readNumber(){ $num = fread($this->buffer, 8); $r = ""; for($byte = 7 ; $byte >= 0 ; $byte--) { // reverse the bytes $r .= $num[$byte]; } $ret = unpack("dnum",$r); return $ret['num']; }
      That looks at lot like the lines 153-162 from here (direct link here):
      153 // read number 154 function readNumber(){ 155 $num = fread($this->buffer, 8); 156 $r = ""; 157 for($byte = 7 ; $byte >= 0 ; $byte--) { // reverse the bytes 158 $r .= $num[$byte]; 159 } 160 $ret = unpack("dnum",$r); 161 return $ret['num']; 162 }
      And I believe that's PHP, not Perl. I'm thankful for the suggestion although still looking for the Perl equivalent of the above.
      --
      Andreas
        Translate that to perl, its easy