Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling

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.

Comment on Binary to decimal conversion
Select or Download Code
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
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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://656344]
Approved by almut
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (6)
As of 2015-07-05 23:58 GMT
Find Nodes?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...

    Results (68 votes), past polls