8
votes

Convertir une valeur binaire en hexadécimal en rubis

J'ai une situation où j'ai besoin de convertir une valeur binaire en hexagonale dans Ruby. Ma situation est la suivante:

Lorsque bin = "0000111" , ma sortie doit être: hex = "07" . .

Lorsque bin = "010001111" , ma sortie doit être: heex = "08f" .

Quelqu'un pourrait-il m'aider sur la façon de faire ça? Merci d'avance.


0 commentaires

4 Réponses :


5
votes

Tous les deux String # to_i et integer # to_s Prenez un argument entier en option spécifiant la base. Vous pouvez donc convertir votre chaîne binaire en un entier à l'aide de la base 2, puis convertir cet entier en une chaîne à l'aide de la base 16.


2 commentaires

hey merci pour votre réponse .. comme tu dis si j'utilise "11111" .to_i (2) .to_s (16) Cela me donne "1f" mais si je donne "01111" .to_i (2) .to_s (16). ne me donne que "f" mais je veux "0f"


@sundar: Vous pouvez utiliser string #% (AKA sprintf ) au lieu de to_s pour formater le numéro de manière appropriée - en utilisant % 02x < / Code> Pour formater le numéro sous forme d'un numéro hexadécimal rembourré à 2 chiffres en utilisant 0s. Cependant, cela ne fonctionne pas si vous souhaitez une base autre que 16 (ou 10 si vous utilisez d au lieu de x ), comme % ne fonctionne pas vous permettent de choisir une base arbitraire. Sinon, vous pouvez utiliser to_s suivi de chaîne # RJUST , qui fonctionne avec des bases arbitraires et des caractères de rembourrage.



13
votes

Que diriez-vous:

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


3 commentaires

Lorsque je passe dans "1" un peu binaire, cela convertit à 001. ne devrait-il pas convertir en "1" dans Hex?


`` `(" 0% 02x "% binaire.to_i (2)) # =>" 001 "


"0x% 02x"% "1" .to_i (2) # => "0x01" .



10
votes
def bin_to_hex(s)
    s.each_byte.map { |b| b.to_s(16).rjust(2,'0') }.join
end
Which I found here (with zero padding modifications):http://anthonylewis.com/2011/02/09/to-hex-and-back-with-ruby/

3 commentaires

Je ne sais pas comment les gens prétendent que ça marche! Pour moi, en utilisant Ruby 4.1, il donne: '1111'.each_byte.map {| B | B.TO_S (16)} .join => "31313131" (et je veux "F" ou quelque chose de similiaire.)


@Djunzu Vous parlez de quelque chose de différent. La chaîne '1111' a quatre octets et chacune a une valeur de 49 (c.-à-d. La valeur ASCII). 49 en décimal est 31 dans Hex. Vous n'avez pas de valeur «binaire» dans le sens où la question parle de la question. Vous avez une chaîne contenant des caractères ASCII '1' et '0' .


@Djunzu en fait, ne jamais. Je viens de réaliser que réellement, vous avez raison et la réponse utilise "binaire" dans le mauvais sens.



3
votes

Vous pouvez utiliser la méthode Déballez sur la chaîne pointant la cible à hex xxx

se référer à: https://apidock.com/Ruby/string/unpack

J'ai trouvé qu'il est beaucoup plus propre que les solutions énumérées ci-dessus.


0 commentaires