从Ruby确定sizeof(double)和sizeof(int)的最简单方法?
要使用Ruby的String.unpack解压缩具有混合双精度和整数的复杂二进制字符串,我需要确定二进制字符串中的偏移量。 通常,双精度数是8个字节,整数是4个字节,但为了使我的代码与机器无关,我想从我的Ruby代码中查询这些大小。
从Ruby中确定整数和双精度大小的最简单方法是什么,即请求对C的sizeof( type )
方法的请求的响应?
我找到了一个可行的解决方案,使用Array#pack
, String#unpack
的反向方法。 通过打包1个整数或1个double的字符串,可以从ruby本身确定整数和双精度的大小,这与使用sizeof(int)
或sizeof(double)
结果相同(因为Array#pack
的实现)在C):
[1.to_i].pack("i").size # 4 [1.to_f].pack("d").size # 8
这是显而易见的,我可能错过了这一点:
puts 1.size #=> 4 puts (256**10 - 1).size #=> 12
我不熟悉Ruby语言或其构建/分发系统。 但是, Rake的存在表明可以在包安装上创建自定义文件 – 例如,将以下命令的结果导出为Ruby常量的配置文件:
echo __SIZEOF_INT__ | gcc -E -P - echo __SIZEOF_DOUBLE__ | gcc -E -P -
我目前的解决方案是有一个小的C程序sizeofdouble.c
:
#include int main() { printf( "%lu", sizeof(double) ); }
当编译成sizeofdouble
可执行文件时,可以从ruby中调用
sizeofdouble = `./sizeofdouble`.to_i
但这是一个丑陋的黑客,而不是这个问题的干净解决方案。