在Ruby中计算Array包结构格式的大小

时间:2010-12-20 00:31:13

标签: ruby pack

例如dddddd是系统的原生格式,所以我无法准确知道它有多大。

在python中,我可以这样做:

import struct
print struct.calcsize('ddddd')

将返回40

我如何在Ruby中获得这个?

2 个答案:

答案 0 :(得分:2)

我还没有找到内置的方法来做到这一点,但是当我知道我只处理数字格式时,我已经成功使用了这个小函数:

  def calculate_size(format)
    # Only for numeric formats, String formats will raise a TypeError
    elements = 0
    format.each_char do |c|
      if c =~ /\d/
        elements += c.to_i - 1
      else
        elements += 1
      end
    end
    ([ 0 ] * elements).pack(format).length
  end

这构造了一个适当数量的零的数组,用你的格式调用pack(),并返回长度(以字节为单位)。零在这种情况下工作,因为它们可以转换为每种数字格式(整数,双精度,浮点数等)。

答案 1 :(得分:0)

我不知道捷径,但你可以打包一个并询问它有多长:

length_of_five_packed_doubles = 5 * [1.0].pack('d').length

顺便说一下,结合了pack方法的ruby数组似乎在功能上等同于python的struct模块。 Ruby几乎复制了perl的pack并将它们作为方法放在Array类上。