2013-05-13 222 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做得更好?

相關問題