2013-05-13 173 views
0

我需要在我的某个模型的整数列中存储字母数字字符串。将字母数字字符串转换为整数格式

我曾尝试:

@result.each do |i| 
    hex_id = [] 
    i["id"].split(//).each{|c| hex_id.push(c.hex)} 
    hex_id = hex_id.join 
    ... 
    Model.create(:origin_id => hex_id) 
    ... 
end 

当我在地方建立线的使用puts hex_id控制台运行它,它返回正确的价值观,但在origin_id上面的代码结果被设置为“2147483647 “对于每一个实例。一个示例字符串输入是“t6gnk3pp86gg4sboh5oin5vr40”,所以对我来说没有任何意义。

任何人都可以告诉我这里出了什么问题,或者建议一个更好的方法来存储像上述示例一样的字符串作为唯一的整数吗?

谢谢。

+0

看来你溢出整数边界。也许你需要更大的数据类型,比如64位整数(long)? – 2013-05-13 19:38:26

+0

@IvayloSlavov也许......但这并不能解释为什么“t6gnk3pp86gg4sboh5oin5vr40”变成了“2147483647”而不是“060003008600401100500050040”。 – aperture 2013-05-13 19:41:50

+0

'“060003008600401100500050040”'是一个数字太大的整数。可能长时间太长。如果十六进制函数只是在整数的二进制表示上设置标志,那么当所有标志都被设置时,你会得到最大值(对于有符号类型的最小值)。但我希望你能收到'-2147483648'。它肯定似乎与结果 – 2013-05-13 19:46:00

回答

0

应答通过申请表OP

看来,hex_id.join操作不串接在这种情况下字符串,而是款项或执行十六进制值的二进制补码。这个问题也可能是hex_id是一个十六进制数组而不是字符串或char数组。然而,似乎发生的是达到整数类型2147483647的最大正值。尽管如此,我还是无法在array.join上找到应用于十六进制数组的任何文档化效果,但它看起来并不是元素的串联。

另一方面,期望的结果060003008600401100500050040太大,无法记录为整数。更好的方法是将其保留为字符串,或者使用不同的算法来生成原始字符串的数字。也许通过算术运算来汇总十六进制值将会比join做得更好?