2012-03-30 2 views
0

Je suis tombé sur une erreur que je ne comprends pas très bien.String # pack fonctionne sur 1.9+, pas 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]" 

Tout le monde peut expliquer pourquoi, et comment puis-je résoudre ce problème? Si aucune solution portable ne peut être utilisée, j'en ai besoin d'une pour 1.8.7.

+0

Que voulez-vous avec ce .pack ('N')? Raccourcir le résultat? – karatedog

+0

Oui, j'utilise un extrait de code de https://github.com/technoweenie/guillotine/blob/master/lib/guillotine.rb – ksol

+0

Ensuite, allez avec la suggestion de Said. ("N") ne prendra que les 32 derniers bits, donc modulo ne changera pas le résultat. – karatedog

Répondre

3

Dans Ruby 1.8+, paquet échoue si la valeur est trop grande - mais vous pouvez obtenir le même comportement en considérant uniquement les bits de poids faible, en changeant:

[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") 
Questions connexes