Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I print a hex number representing a IEEE 754 float as a float in ruby

Tags:

ruby

ieee-754

I am using ruby to parse a datastream, some parts of which are IEEE-754 floats, but am not sure how to print these as floats. For example:

f = 0xbe80fd31 # -0.2519317
puts "%f" % f
3196124465.000000

how do I get -0.2519317 ?

like image 663
kugelfest Avatar asked Nov 21 '25 20:11

kugelfest


1 Answers

Any time your converting a binary byte stream to something else, you usually end up using String#unpack (and Array#pack if you're going the other way).

If you have these bytes:

bytes = [0xbe, 0x80, 0xfd, 0x31]

then you could say:

bytes.map(&:chr).join.unpack('g')
# [-0.25193169713020325]

and then unwrap the array. This:

bytes.map(&:chr).join

packs the bytes into the string:

"\xbe\x80\xfd\x31"

which is suitable for #unpack. You could also (thanks Stefan) say:

# Variations on getting the bytes into a string for `#unpack`
bytes.pack('C4').unpack('g').first
[0xbe80fd31].pack('L>').unpack('g').first

# Variations using `#unpack1`
bytes.map(&:chr).join.unpack1('g')
bytes.pack('C4').unpack1('g')
[0xbe80fd31].pack('L>').unpack1('g')

If you already have the string then you go can straight to #unpack or #unpack1.

You'll want to use 'e' instead of 'g' your bytes are in a different order and 'E' or 'G' if you actually have an eight byte double rather than a four byte float.

like image 58
mu is too short Avatar answered Nov 24 '25 11:11

mu is too short



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!