Я не нашел встроенного способа сделать это, но у меня был успех с этой маленькой функцией, когда я знаю, что имею дело только с числовыми форматами:
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 () с вашим форматом и возвращает длину (в байтах). Нули работают в этом случае, потому что они могут быть преобразованы в каждый из числовых форматов (целое, двойное, число с плавающей точкой и т. Д.).