私はバイナリ文字列を持っているBIGNUMに変換は、ルビーの文字列が
x = "c1\x98\xCCf3\x1C\x00.\x01\xC7\x00\xC0"
(実際にははるかに長い)と言います。私はBignumとして表現する必要があります。これは、何かの基本シーケンス(何か> 36)へのさらなる変換のためです。
x.unpack('H*')[0].to_i
は、Bignumではなく、値の最初のバイトから整数を生成します。
私はバイナリ文字列を持っているBIGNUMに変換は、ルビーの文字列が
x = "c1\x98\xCCf3\x1C\x00.\x01\xC7\x00\xC0"
(実際にははるかに長い)と言います。私はBignumとして表現する必要があります。これは、何かの基本シーケンス(何か> 36)へのさらなる変換のためです。
x.unpack('H*')[0].to_i
は、Bignumではなく、値の最初のバイトから整数を生成します。
:たとえば
x.unpack('H*')[0].to_i(16)
を。直接(必要に応じて自動的にBIGNUMになります)数にバイナリ文字列を変換するには
、あなたが行うことができます:Rubyで
"\xc1\x98\xCC\xf3\x1C\x00".bytes.inject {|a, b| (a << 8) + b }
=> 212862017674240
String#to_i
のデフォルトベースは10ですが、16進数を変換しようとしていますので.to_i(16)
が必要です。ベースを指定しないと、to_i
は最初の10進以外の値が表示され、切り捨てが発生する場所で停止します。
あなたはこの言いたい:中間進文字列表現を通じてunpack
を使用して行くする必要はありません
>> "633198cc66331c0001c700c0633198cc66331c0001c700c063312e98cc66331c0001c700c0".to_i
=> 633198
>> "633198cc66331c0001c700c0633198cc66331c0001c700c063312e98cc66331c0001c700c0".to_i(16)
=> 49331350698902676183344474146684368690988113012187221237314170009285390086987127695278272
、Integer型はFixnumsとBignumsを包含する。なぜあなたはビンガムではないと言いますか?私はx.unpack( 'H *')[0] .to_i.class'と言ったときに 'Bignum'を取得します。ここで' x'は非常に大きいです。 –
@レイ:あなたはBignumのために十分遠くまで幸運を得て、十進法以外の数字を打たないといけません。 –