Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

Binary to decimal conversion

by andreas1234567 (Vicar)
on Dec 11, 2007 at 08:30 UTC ( #656344=perlquestion: print w/replies, xml ) Need Help??
andreas1234567 has asked for the wisdom of the Perl Monks concerning the following question:


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:

  • 3F F0 00 00 00 00 00 00 should yield 1.
  • 40 59 00 00 00 00 00 00 should yield 100.
  • 41 33 1A 9D 00 00 00 00 should yield 1251997.
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.

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?

        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.
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.
        Translate that to perl, its easy

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://656344]
Approved by almut
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (6)
As of 2017-01-22 16:46 GMT
Find Nodes?
    Voting Booth?
    Do you watch meteor showers?

    Results (188 votes). Check out past polls.