String#pack适用于1.9+,而不是1.8 *

时间:2012-03-30 13:14:07

标签: ruby ruby-1.9 pack ruby-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")
=> "17!@"

任何人都可以解释原因,我该如何解决这个问题?如果不能使用便携式解决方案,我需要一个1.8.7。

1 个答案:

答案 0 :(得分:3)

Ruby 1.8 + 中,如果值太大,则pack会失败 - 但只需考虑低位,即可通过更改来获得相同的行为:

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