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

问题描述 投票:1回答:5

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

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

c ruby sizeof unpack
5个回答
3
投票

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

[1.to_i].pack("i").size # 4
[1.to_f].pack("d").size # 8

2
投票

这很明显,我可能错过了这一点:

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

1
投票

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

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

0
投票

我目前的解决方案是有一个小的C程序,sizeofdouble.c

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

当编译成sizeofdouble可执行文件时,可以从ruby中调用

sizeofdouble = `./sizeofdouble`.to_i

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


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

见:https://ruby-doc.org/stdlib-2.5.0/libdoc/fiddle/rdoc/Fiddle.html#SIZEOF_CHAR

© www.soinside.com 2019 - 2024. All rights reserved.