2012-04-01 35 views
5

Jak przekonwertować sześciokątny znak do jego 32 bitowego odpowiednika int w ruby? npciąg szesnastkowy do konwersji int w Ruby

a = "fb6d8cf1" #hex string 
[a].pack('H*').unpack('l') #from the documentation it unpacks to its 32 bit signed int 

To konwertuje do

-242455045 

Ale rzeczywista odpowiedź jest

-76706575 

Czy możesz wskazać mi co robię źle?

Odpowiedz

3

Można przerzucić bajtów sobie obejść endian i podpisać zagadnienia:

>> ['fb6d8cf1'.scan(/[0-9a-f]{2}/i).reverse.join].pack('H*').unpack('l') 
=> [-76706575] 
0

Zastosowanie:

class String 
    def to_si(base, lenght = 32) 
    mid = 2**(length-1) 
    max_unsigned = 2**length 
    n = self.to_i base 
    (n>=mid) ? n - max_unsigned : n 
    end 
end 

"fb6d8cf1".to_si 16, 32 
+0

kod działa dla liczb ujemnych. Dzięki. Ale w przypadku liczb dodatnich nie udaje się, np. "038a67f90" jest renderowane jako 950435728, ale rzeczywista wartość to 59402233 –

3

Wygląda jakbyś miał endian problem. To daje pożądanego rezultatu:

[a].pack("H*").unpack("l>") 
# => [-76706575] 
["038a67f90"].pack("H*").unpack("l>") 
#=> [59402233] 
+0

, której wersji ruby ​​używasz? ponieważ nawet po użyciu l> i wciąż otrzymuję -242455045 –

+0

ruby ​​1.9.3p125 (2012-02-16 rewizja 34643) [x86_64-darwin11.3.0] –

+0

dokładnie dokumentacja mówi także, że l> działa tylko od 1.9.3. Niestety nie mogę uaktualnić ruby ​​na serwerze produkcyjnym i muszę znaleźć obejście tego problemu. –

Powiązane problemy