2012-04-01 14 views
5

¿Cómo convierto un hex strign a su equivalente int de 32 bits en ruby? por ejemplocadena hexadecimal para la conversión int firmada en Ruby

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

Convierte a

-242455045 

Pero la respuesta real es

-76706575 

¿Me podría apuntar a lo que estoy haciendo mal?

Respuesta

3

Se podía voltear los bytes de sí mismo para moverse por la endian y firmar cuestiones:

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

Uso:

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

El código funciona para los números negativos. Gracias. Pero falla para números positivos, por ejemplo, "038a67f90" se representa como 950435728, pero el valor real es 59402233 –

3

Parece que tenía un problema de endian. Esto da el resultado deseado:

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

¿En qué versión de ruby ​​estás? porque incluso después de usar l> sigo obteniendo -242455045 –

+0

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

+0

exactamente la documentación también dice que l> solo funciona desde 1.9.3. Desafortunadamente no puedo actualizar Ruby en el servidor de producción y tengo que encontrar una solución para esto –

Cuestiones relacionadas