2012-03-30 7 views
0

私はかなり理解していないエラーに遭遇しました。String#packは1.8ではなく1.9+で動作します*

# Ruby 1.8.7 
>> [Digest::MD5.hexdigest("http://www.google.com").to_i(16)].pack("N") 
RangeError: bignum too big to convert into 'unsigned long' 

# Ruby 1.9.3 
>> [Digest::MD5.hexdigest("http://www.google.com").to_i(16)].pack("N") 
=> "[email protected]" 

誰もがなぜこの問題を解決することができますか?ポータブルなソリューションが使えない場合は、1.8.7用のソリューションが必要です。 ルビー1.8+

+0

そのパックで何をしたいですか?( 'N')?結果を短くする? – karatedog

+0

はい、https://github.com/technoweenie/guillotine/blob/master/lib/guillotine.rbのコードスニペットを使用しています – ksol

+0

その後、Saidの提案に従ってください。 ( "N")は最後の32ビットしか取らないので、モジュロは結果を変更しません。 – karatedog

答えて

3

値が大きすぎると、パックは失敗した - しかし、あなたは変更することで、唯一の下位ビットを考慮して同じ動作を得ることができます。

[Digest::MD5.hexdigest("http://www.google.com").to_i(16)].pack("N") 

[Digest::MD5.hexdigest("http://www.google.com").to_i(16) % 2**32].pack("N") 
関連する問題