Wednesday, April 20, 2011

How to convert a double to hex?

Hello, How do I convert a ruby float/double to high endian order hex with high bytes and low bytes.

EXAMPLE:

start with 99.0

end up with

40 58 C0 00   00 00 00 00
high bytes    low bytes
From stackoverflow
  • The array class has a pack method:

    a = [99.0]
    s = a.pack("d")
    s
    => "\000\000\000\000\000\300X@"
    

    This gives you a byte string, but converting from that to hex for printing should be trivial.

    If you want to go the other way, the string class has an unpack method:

    s.unpack("d")
    =>[99.0]
    
  • Well, like Patrick said, it doesn't take a lot to convert past using Array\#pack.

    irb> [99.0].pack('G').split('').map { |ds| ds[0] }
    #=> [64, 88, 192, 0, 0, 0, 0, 0]
    irb> _.map { |d| "%02x" % d }
    #=> ["40", "58", "c0", "00", "00", "00", "00", "00"]
    irb> [99.0].pack('E').split('').map { |ds| ds[0] }
    #=> [0, 0, 0, 0, 0, 192, 88, 64]
    irb> _.map { |d| "%02x" % d }    
    #=> ["00", "00", "00", "00", "00", "c0", "58", "40"]
    

    So it depends whether you want to unpack it with the high-order byte in the zero index or the low order byte in the zero index:

          E     |  Double-precision float, little-endian byte order
          G     |  Double-precision float, network (big-endian) byte order
    

0 comments:

Post a Comment

Note: Only a member of this blog may post a comment.