2012-03-30 9 views
0

Ich stolperte über einen Fehler, den ich nicht ganz verstehe.String # pack arbeitet auf 1.9+, nicht 1.8 *

# 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]" 

Jeder kann erklären, warum, und wie kann ich dieses Problem lösen? Wenn keine tragbare Lösung verwendet werden kann, brauche ich eine für 1.8.7.

+0

Was willst du mit diesem .pack ('N')? Kürzen Sie das Ergebnis? – karatedog

+0

Ja, ich verwende ein Code-Snippet von https://github.com/technoweenie/guillotine/blob/master/lib/guillotine.rb – ksol

+0

Dann gehen Sie mit Saids Vorschlag. ("N") nimmt nur die letzten 32 Bit, so dass modulo das Ergebnis nicht ändert. – karatedog

Antwort

3

In Rubin 1.8+ versagt Pack, wenn der Wert zu groß ist - aber man kann nur unter Berücksichtigung des niederwertigen Bits, indem das gleiche Verhalten erhalten:

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

zu

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