1

Ruby のString.unpackを使用して double と整数が混在する複雑なバイナリ文字列をアンパックするには、バイナリ文字列内のオフセットを決定する必要があります。通常、double は 8 バイト、integer は 4 バイトですが、コードをマシンに依存しないようにするために、Ruby コード内からこれらのサイズを照会したいと考えています。

sizeof( type )Ruby 内から整数と double のサイズを決定する最も簡単な方法、つまり、C のメソッドにリクエストの応答を要求する方法は何ですか?

4

5 に答える 5

3

Array#packの逆の方法であるを使用して、実行可能な解決策を見つけましたString#unpack。1 つの整数または 1 つの double の文字列をパックすることにより、 ( Cでの の実装により) sizeof(int)orを使用した場合と同じ結果が得られる ruby​​ 自体から整数と double のサイズを決定することができます。sizeof(double)Array#pack

[1.to_i].pack("i").size # 4
[1.to_f].pack("d").size # 8
于 2011-02-23T16:16:09.770 に答える
2

これは非常に明白であるため、おそらく要点を見逃しています。

puts 1.size #=> 4
puts (256**10 - 1).size   #=> 12
于 2011-02-21T21:03:31.773 に答える
1

私はRuby言語またはそのビルド/配布システムに精通していません。ただし、Rakeの存在は、パッケージのインストール時にカスタムファイルを作成できることを示しています。たとえば、次のコマンドの結果をRuby定数としてエクスポートする構成ファイルです。

echo __SIZEOF_INT__ | gcc -E -P -
echo __SIZEOF_DOUBLE__ | gcc -E -P -
于 2011-02-21T17:35:27.687 に答える
0

私の現在の解決策は、小さなCプログラムを用意することですsizeofdouble.c:

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

sizeofdoubleこれは、実行可能ファイルにコンパイルされると、ruby から呼び出すことができます

sizeofdouble = `./sizeofdouble`.to_i

しかし、それはこの問題のきれいな解決策ではなく、醜いハックです。

于 2011-02-21T14:56:47.303 に答える