【问题标题】:How the floating point directive works in Ruby packing()/unpacking()? [closed]浮点指令如何在 Ruby 打包()/解包()中工作? [关闭]
【发布时间】:2013-01-12 18:15:58
【问题描述】:

这里的任何人都可以帮助我了解以下浮点指令如何在 Ruby 中使用 packing() and unpacking() 方法工作吗?

  • D and d
  • F and f
  • g and G
  • e and E

我在下面尝试过:

irb(main):001:0> [2,44,43].pack('D')
=> "\x00\x00\x00\x00\x00\x00\x00@"
irb(main):002:0> [2,44,43].pack('d')
=> "\x00\x00\x00\x00\x00\x00\x00@"
irb(main):004:0> [2,44,43].pack('ddd')
=> "\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00F@\x00\x00\x00\x00\x00\
x80E@"
irb(main):005:0> [2,44,43].pack('fff')
=> "\x00\x00\x00@\x00\x000B\x00\x00,B"
irb(main):006:0> [2,44,43].pack('FFF')
=> "\x00\x00\x00@\x00\x000B\x00\x00,B"
irb(main):007:0> [2,44,43].pack('ggg')
=> "@\x00\x00\x00B0\x00\x00B,\x00\x00"
irb(main):008:0> [2,44,43].pack('GGG')
=> "@\x00\x00\x00\x00\x00\x00\x00@F\x00\x00\x00\x00\x00\x00@E\x80\x00\x00\x00\x0
0\x00"
irb(main):009:0>

输出是怎么来的?这种计算的逻辑是什么?

提前致谢!

【问题讨论】:

  • documentation 的哪一部分有问题?
  • 是的,他们只是展示了一些带有示例的指令,但不是我的全部列表。所以作为ruby这个平台的新手,我真的很想知道这些究竟是如何工作的,它们的逻辑是什么?
  • 您是否尝试将它们与十六进制翻斗机结合使用?它们的工作方式与在 Python 和 Perl 中的工作方式相同:它们将原生类型与原始位进行转换。
  • 你为什么不在irb试试这些?你问的大多数人也不知道这些是如何工作的。找出答案的诀窍是使用irb 来测试它们。那么您尝试过什么,您对这些方法有什么特别不了解的地方?您的问题范围太广。
  • 简单地说:浮点数具有计算机、C 和 C++ 可以理解的二进制表示和 Ruby 可以理解的另一种表示; packunpack 用于在这两者之间进行转换。它们通常用于读/写二进制文件和说二进制网络协议。

标签: ruby ruby-1.9.3


【解决方案1】:

这些指令将数组中的数字转换为浮点字节表示。

如果您想了解正在发生的事情,可以观看此视频:

浮点表示:示例
https://www.youtube.com/watch?v=t-8fMtUNX1A

阅读这篇文章:
http://www.geeksforgeeks.org/floating-point-representation-basics/

通过谷歌,我找到了searching for "floating point representation"为您提供的上述答案。


举个例子:

> [2.0].pack('f').bytes.map(&:to_i)
=> [0, 0, 0, 64]

这是一个浮点数,用十六进制表示为:

0x40000000

您可以看到64 是十六进制的0x40

为了理解为什么2.0 变成0x40000000,您必须了解计算机如何将浮点数转换为二进制表示。

您可以使用此页面进行测试:
http://www.h-schmidt.net/FloatConverter/IEEE754.html

例如,2.0 的样子如下:

【讨论】:

  • 不,我给你一个帖子,看看有人如何回答那个帖子。我没有找到我上述帖子的任何答案,因此发布了。看看解释。请不要给我投反对票! post.
  • @PythonLikeYOU 我读了那个答案。这不能简单地回答。请观看视频(10 分钟),您会发现事情没有那么简单。
  • 好吧!那就打开吧,希望任何人都可以在这里回答,不要拒绝投票,这让我的帖子很难看!顺便说一句,我正在查看视频!
  • @PythonLikeYOU - 观看视频,然后查看我编辑的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多