Самый простой способ определить sizeof (double) и sizeof (int) из Ruby? - PullRequest
1 голос
/ 21 февраля 2011

Для распаковки сложных двоичных строк со смешанными двойными и целыми числами, используя Ruby's String.unpack Мне нужно определить смещения в двоичной строке. Обычно double - это 8 байтов, а целые - 4 байта, но для того, чтобы сделать мой код машинно-независимым, я бы хотел запросить эти размеры из моего кода Ruby.

Какой самый простой способ определить размер целых и двойных чисел в Ruby, т. Е. Запросить ответ на запрос метода C sizeof( type )?

Ответы [ 5 ]

3 голосов
/ 23 февраля 2011

Я нашел работоспособное решение, используя Array#pack, обратный метод String#unpack. Упаковав строку из 1 целого или 1 двойного, можно определить размер целых чисел и двойников из самого ruby, что дает те же результаты, что и при использовании sizeof(int) или sizeof(double) (из-за реализации Array#pack в C ):

[1.to_i].pack("i").size # 4
[1.to_f].pack("d").size # 8
2 голосов
/ 22 февраля 2011

Это так очевидно, что я, вероятно, упускаю суть:

puts 1.size #=> 4
puts (256**10 - 1).size   #=> 12
1 голос
/ 21 февраля 2011

Я не знаком с языком Ruby или его системой сборки / распространения.Однако существование Rake предполагает, что при установке пакета можно создавать пользовательские файлы - например, файл конфигурации, который экспортирует результат следующих команд как константы Ruby:

echo __SIZEOF_INT__ | gcc -E -P -
echo __SIZEOF_DOUBLE__ | gcc -E -P -
0 голосов
/ 18 апреля 2019

Я знаю, что опаздываю на вечеринку, но библиотека Fiddle ruby ​​предоставляет размеры всех типов данных, которые вы можете использовать в качестве констант. Вот результаты на моей системе (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

0 голосов
/ 21 февраля 2011

Мое текущее решение состоит в том, чтобы иметь небольшую программу на C, sizeofdouble.c:

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

, которую при компиляции в исполняемый файл sizeofdouble можно вызывать из ruby ​​с помощью

sizeofdouble = `./sizeofdouble`.to_i

но это уродливый взлом, а не чистое решение этой проблемы.

...