2012-03-30 5 views
0

Я наткнулся на ошибку, которую я не совсем понимаю.String # pack работает на 1.9+, а не 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]" 

Любой может объяснить, почему и как я могу это решить? Если портативное решение не может быть использовано, мне нужен один для 1.8.7.

+0

Что вам нужно с этим .pack ('N')? Сократить результат? – karatedog

+0

Да, я использую фрагмент кода из https://github.com/technoweenie/guillotine/blob/master/lib/guillotine.rb – ksol

+0

Затем перейдите к предложению Саида. («N») будет принимать только последние 32 бит, поэтому модуль не изменит результат. – karatedog

ответ

3

В Руби 1.8+, пакет не выполняется, если значение слишком велико - но вы можете получить такое же поведение, лишь учитывая биты низкого порядка, путем изменения:

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

 Смежные вопросы

  • Нет связанных вопросов^_^