2011-05-18 11 views
5

tengo una situación en la que necesito convertir un valor binario a hexadecimal en ruby ​​como sigue:
if bin = "0000111" entonces mi salida debe ser: hex = "07"
& supongo que si bin = "010 001 111", entonces O/P debe ser: hex = "08F"
es posible que alguien me ayude a cabo sobre cómo hacer esto .. Gracias de antemano ..Convirtiendo un valor binario a hexadecimal en ruby ​​

Respuesta

9

¿Qué tal:

>> "0x%02x" % "0000111".to_i(2) #=> "0x07" 
>> "0x%02x" % "010001111".to_i(2) #=> "0x8f" 

Editar: si no desea que la salida para ser 0x.. pero solo 0.. omita el primer x en la cadena de formato.

+0

hola muchas gracias .. – sundar

+0

cuando paso en '1' un solo bit binario, esto se convierte en 001. ¿No debería convertirse a '1' en hexadecimal también? – uptownhr

+0

'' ' (" 0% 02x "% binary.to_i (2)) # =>" 001 " – uptownhr

5

Tanto String#to_i y Integer#to_s toma un argumento entero opcional que especifica la base. Por lo que puede convertir la cadena de binario a un entero usando la base 2 y luego convertir ese entero de nuevo a una cadena utilizando la base 16.

+1

hey gracias por tu respuesta. Como dices si uso "11111" .to_i (2) .to_s (16) me da "1f", pero si doy "01111" .to_i (2) .to_s (16) me da solo "f" pero quiero "0f" – sundar

+1

@sundar: Puedes usar 'String #%' (aka 'sprintf') en lugar de' to_s' para formatear el número apropiadamente - usando '% 02x' para formatear el número como un número hexadecimal rellenado a 2 dígitos usando 0s. Sin embargo, esto no funciona si quiere una base distinta de 16 (o 10 si usa 'd' en lugar de' x'), ya que '%' no le permite elegir una base arbitraria. Alternativamente, puede usar 'to_s' seguido de' String # rjust', que funciona con bases arbitrarias y caracteres de relleno. – sepp2k

+0

hola muchas gracias ... – sundar

6

me gusta esta respuesta mejor:

def bin_to_hex(s) 
    s.each_byte.map { |b| b.to_s(16) }.join 
end 

Lo que me pareció aquí:

http://anthonylewis.com/2011/02/09/to-hex-and-back-with-ruby/

ACTUALIZACIÓN

me di cuenta de que no 0s almohadilla correctamente, por lo que se modificó a esto:

def bin_to_hex(s) 
    s.each_byte.map { |b| b.to_s(16).rjust(2,'0') }.join 
end 
+0

¡No sé cómo dicen las personas que funciona! Para mí, usando ruby ​​4.1, da: ''1111'.each_byte.map {| b | b.to_s (16)}. unir => "31313131" '(Y quiero' "f" 'o algo similar.) – Djunzu

+0

@Djunzu Estás hablando de algo diferente. La cadena ''1111'' tiene cuatro bytes, y cada uno tiene un valor de 49 (es decir, el valor ASCII). 49 en decimal es 31 en hex. No tiene un valor "binario" en el sentido de que la pregunta está hablando. Tienes una cadena que contiene caracteres ASCII ''1'' y'' 0''. – Ryan

+0

@Djunzu En realidad, no importa. Me acabo de dar cuenta de que, en realidad, tienes razón, y la respuesta es usar "binario" en el sentido equivocado. – Ryan

Cuestiones relacionadas