ruby - 如何将代表 IEEE 754 float 的十六进制数字打印为 ruby​​ 中的 float

标签 ruby ieee-754

我正在使用 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/

相关文章:

ruby - 如何遍历 Ruby 中的范围数组?

floating-point - 为什么无穷大 × 0 = NaN?

c - 如何将二进制数(32 位)转换为十进制数?

floating-point - IEEE浮点,如何计算偏差

functional-programming - 方案:仅使用 R6RS,如何确定浮数的尾数和指数

c - 将 32 位无符号 long 解释为 C 中的单精度 IEEE-754 float

ruby-on-rails - ruby rails : Foursquare remove list item gives 400 value is invalid for item id

ruby-on-rails - 将现有的 Rails 应用程序导入 RubyMine 项目

ruby-on-rails - 如何使用其他方法扩展 ActiveRecord::Migration?

ruby - 如何使用 Ruby 和 Nokogiri 删除缺少子节点的节点