从Ruby确定sizeof(double)和sizeof(int)的最简单方法?

时间:2011-02-21 14:39:45

标签: c ruby sizeof unpack

使用Ruby的String.unpack解压缩具有混合双精度和整数的复杂二进制字符串我需要确定二进制字符串中的偏移量。通常,双精度数是8个字节,整数是4个字节,但为了使我的代码与机器无关,我想从我的Ruby代码中查询这些大小。

从Ruby中确定整数和双精度大小的最简单方法是什么,即请求对C sizeof( type )方法的请求的响应?

5 个答案:

答案 0 :(得分:3)

我找到了一个可行的解决方案,使用Array#packString#unpack的逆方法。通过打包1个整数或1个double的字符串,可以确定ruby本身内的整数和双精度的大小,这与使用sizeof(int)sizeof(double)的结果相同(因为{的实现C)中的{1}}:

Array#pack

答案 1 :(得分:2)

这是显而易见的,我可能忽略了这一点:

puts 1.size #=> 4
puts (256**10 - 1).size   #=> 12

答案 2 :(得分:1)

我不熟悉Ruby语言或其构建/分发系统。但是,Rake的存在表明可以在包安装上创建自定义文件 - 例如,将以下命令的结果导出为Ruby常量的配置文件:

echo __SIZEOF_INT__ | gcc -E -P -
echo __SIZEOF_DOUBLE__ | gcc -E -P -

答案 3 :(得分:0)

我目前的解决方案是使用一个小型C程序sizeofdouble.c

#include <stdio.h>
int main() {
    printf( "%lu", sizeof(double) );
}

,当编译为sizeofdouble可执行文件时,可以使用

从ruby调用
sizeofdouble = `./sizeofdouble`.to_i

但这是一个丑陋的黑客,而不是解决这个问题的干净方法。

答案 4 :(得分:0)

我知道我来晚了,但是ruby的Fiddle库公开了您可能想要作为常量的所有数据类型的大小。这是我的系统(64位MacOS 10.13)上的结果:

require 'fiddle'

Fiddle::SIZEOF_SHORT   # => 2
Fiddle::SIZEOF_INT     # => 4
Fiddle::SIZEOF_DOUBLE  # => 8
Fiddle::SIZEOF_SIZE_T  # => 8
Fiddle::SIZEOF_SSIZE_T # => 8

请参阅:documentation