Front page | perl.beginners | Postings from September 2009

## Re: decimal to binary?

From:
John W. Krahn
Date:
September 23, 2009 14:24
Subject:
Re: decimal to binary?
Message ID:
4ABA9213.7000703@shaw.ca
```Bryan R Harris wrote:
> John W. Krahn wrote:
>> Bryan R Harris wrote:
>>>
>>> I need to convert a number like this:   -3205.0569059
>>> ... into an 8-byte double (big and little endian), e.g. 4f 3e 52 00 2a bc 93
>>> d3  (I just made up those 8 byte values).
>>>
>>> Is this easy in perl?  Are long and short ints easy as well?
>> \$ perl -le'print unpack "H*", pack "d", -3205.0569059'
>> e626c5221d0aa9c0
>
>
> Maybe this is just my own ignorance on big-endian vs. little endian, but
> this code:
>
>   print "big-endian:     ", unpack("H*", pack("d", -3205.0569059)), "\n";
>   print "little-endian:  ", unpack("h*", pack("d", -3205.0569059)), "\n";
>
> prints:
>
>   big-endian:     e626c5221d0aa9c0
>   little-endian:  6e625c22d1a09a0c
>
> ... when I expected the little endian to look more like:
>
>   c0 a9 0a 1d 22 c5 26 e6   (spacing for readability)
>
> Did I do it wrong (i.e. is "h*" the wrong string?), or am I confused on how
> big vs. little endian works?

The difference between 'h' and 'H' has nothing to do with endianness:

perldoc -f pack
[ SNIP ]
h   A hex string (low nybble first).
H   A hex string (high nybble first).

A nybble is half of a byte so the only thing exchanged is the order of
each byte's two halves.

AFAIK floating point numbers don't have endianness (but I may be wrong.)
(Besides, in the above example, endianness would be on the pack('d')
side of the equation.)

John
--
The programmer is fighting against the two most
destructive forces in the universe: entropy and
human stupidity.               -- Damian Conway

```