2012-03-22 8 views
2

私はバイナリ文字列を持っているBIGNUMに変換は、ルビーの文字列が

x = "c1\x98\xCCf3\x1C\x00.\x01\xC7\x00\xC0" 

(実際にははるかに長い)と言います。私はBignumとして表現する必要があります。これは、何かの基本シーケンス(何か> 36)へのさらなる変換のためです。

x.unpack('H*')[0].to_i 

は、Bignumではなく、値の最初のバイトから整数を生成します。

+0

、Integer型はFixnumsとBignumsを包含する。なぜあなたはビンガムではないと言いますか?私はx.unpack( 'H *')[0] .to_i.class'と言ったときに 'Bignum'を取得します。ここで' x'は非常に大きいです。 –

+2

@レイ:あなたはBignumのために十分遠くまで幸運を得て、十進法以外の数字を打たないといけません。 –

答えて

5

:たとえば

x.unpack('H*')[0].to_i(16) 

を。直接(必要に応じて自動的にBIGNUMになります)数にバイナリ文字列を変換するには

、あなたが行うことができます:Rubyで

"\xc1\x98\xCC\xf3\x1C\x00".bytes.inject {|a, b| (a << 8) + b } 
=> 212862017674240 
5

String#to_iのデフォルトベースは10ですが、16進数を変換しようとしていますので.to_i(16)が必要です。ベースを指定しないと、to_iは最初の10進以外の値が表示され、切り捨てが発生する場所で停止します。

あなたはこの言いたい:中間進文字列表現を通じてunpackを使用して行くする必要はありません

>> "633198cc66331c0001c700c0633198cc66331c0001c700c063312e98cc66331c0001c700c0".to_i 
=> 633198 
>> "633198cc66331c0001c700c0633198cc66331c0001c700c063312e98cc66331c0001c700c0".to_i(16) 
=> 49331350698902676183344474146684368690988113012187221237314170009285390086987127695278272 
関連する問題