我正在使用 ruby 来解析数据流,其中某些部分是 IEEE-754 float ,但不确定如何将它们打印为 float 。例如:
f = 0xbe80fd31 # -0.2519317
puts "%f" % f
3196124465.000000
如何获得-0.2519317
?
最佳答案
任何时候将二进制字节流转换为其他内容时,通常最终都会使用 String#unpack
(和 Array#pack
如果您选择其他方式)。
如果您有这些字节:
bytes = [0xbe, 0x80, 0xfd, 0x31]
那么你可以说:
bytes.map(&:chr).join.unpack('g')
# [-0.25193169713020325]
然后解开数组。这:
bytes.map(&:chr).join
将字节打包到字符串中:
"\xbe\x80\xfd\x31"
适合#unpack
。您也可以(感谢 Stefan )说:
# 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')
如果您已经有了该字符串,那么您可以直接转到#unpack
或#unpack1
。
您需要使用 'e'
而不是 'g'
您的字节顺序不同,'E'
或'G'
如果您实际上有一个八字节 double 而不是一个四字节 float 。
关于ruby - 如何将代表 IEEE 754 float 的十六进制数字打印为 ruby 中的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60252695/