Conversion d'une chaîne en binaire

Bonsoir à tous,

Saurriez-vous comment faire pour convertir une chaîne de caractères
entrée au clavier en binaire (ou en hexadécimal), en Ruby ?

Au début, je pensais pouvoir y parvenir en créant un tableau ou un
hachage faisant la correspondance entre d’une part, les différents
caractères alphanumériques et leur équivalence en binaire. Mais
finalement cette solution ne règle que partiellement le problème car si
la chaîne contient un caractère chinois (car tout est envisageable ) ou
une ponctuation (ou même un nouveau caractère qui n’existe pas encore),
il ne sera pas pris en compte…

J’avais essayé de trouver une source en googlant, mais sans succès.

Si vous aurriez quelques lignes de code permettant de le faire, cela
m’aiderait beaucoup

Bonne soirée.

Bonjour,

Tu peux peut-être regarder du côté de Array.pack et String.unpack.
Des exemples simples fonctionnent bien mais quant à savoir ce que ça
donne si tu utilises des caractères sortant de l’ASCII…

hex1 = “636f75636f75”
[hex1].pack(‘H*’)
hex2 = “36f65736f657”
[hex2].pack(‘h*’)

bin1 = “011000110110111101110101011000110110111101110101”
[bin1].pack(‘B*’)
bin2 = “110001101111011010101110110001101111011010101110”
[bin2].pack(‘b*’)

Stéphane.
2007/1/25, t5in9tao [email protected]:

Voilà déjà de quoi convertir en BLOB hexa :

strIn = “C’était à Mégara, faubourg de carthage, dans les jardins
d’Hamilcar”

def to_hex(str)
ret = “”
str.each_byte do |c|
ret << format("%02X", c)
end
ret
end

puts to_hex( strIn )

Reste à faire la conversion symétrique …

strIn = “C’était à Mégara, faubourg de carthage, dans les jardins
d’Hamilcar”

Convert string to hexa blob (2 positions per hex)

def to_hex( str )
ret = “”
str.each_byte do |c|
ret << format("%02X", c)
end
ret
end

Convert hexa blob (2 positions per hex) back into string

def to_string( hex_blob )
str = ‘’
hex_blob.gsub!(/[[:xdigit:]]{2}/) { |x| str << x.hex.chr }
str
end

puts “Conversion string vers hex blob to_hex( #{strIn} )”

puts hex_blob = to_hex( strIn )

puts ‘Conversion hex blob vers string’

puts to_string( hex_blob )

Il serait sans doute plus propre d’en faire une classe

ou d’en enrichir la classe String mais ça marche.

CORRECTION : pour ne pas modifier la valeur contenue dans hex_blob,
hex_blob!.gsub est remplacé apr hex_blob.gsub

=========

strIn = “C’était à Mégara, faubourg de carthage, dans les jardins
d’Hamilcar”

Convert string to hexa blob (2 positions per hex)

def to_hex( str )
ret = “”
str.each_byte do |c|
ret << format("%02X", c)
end
ret
end

Convert hexa blob (2 positions per hex) back into string

def to_string( hex_blob )
str = ‘’
hex_blob.gsub(/[[:xdigit:]]{2}/) { |x| str << x.hex.chr }
str
end

puts “Conversion string vers hex blob to_hex( #{strIn} )”

puts hex_blob = to_hex( strIn )

puts ‘Conversion hex blob vers string’

puts to_string( hex_blob )

Il serait sans doute plus propre d’en faire une classe

ou d’en enrichir la classe String mais ça marche.

J’avais essayé de trouver une source en googlant, mais sans succès.

Au fait, connais-tu http://www.google.com/codesearch

(ben oui, j’avoue, j’ai copié :wink:

philippe lachaise wrote:

J’avais essayé de trouver une source en googlant, mais sans succès.

Au fait, connais-tu http://www.google.com/codesearch

(ben oui, j’avoue, j’ai copié :wink:

Youpi ça fonctionne super bien !
Merci !

J’ai remarqué que lorsque j’entrais une chaîne au clavier via un “gets”,
le fait de taper Entrer ajoute un “0A” à la fin de ma chaîne (c sûrement
du à Windows XP). Du coup,

“a” → “61”
“a” → “61” (lorsque j’entre la lettre au clavier dans mon shell)

Bonne continuation. :slight_smile:

J’ai remarqué que lorsque j’entrais une chaîne au clavier via un “gets”,
le fait de taper Entrer ajoute un “0A” à la fin de ma chaîne

Un petit coup de “chomp” pour s’en débarasser :

irb(main):002:0> gets
toto
=> “toto\n”
irb(main):003:0> gets.chomp
toto
=> “toto”
irb(main):004:0>

irb(main):003:0> gets.chomp

Encore mieux :slight_smile:

J’aurais juste une dernière question à ce sujet. Existe-il une méthode
qui permet de convertire une valeur de l’hexadécimal vers le binaire ?

Salut,

Fixnum#to_s permet de spécifier la base de sortie.

Par exemple :
“FF”.hex.to_s(2) #=>“11111111”

Je ne sais pas si ca correspont a ton besoin.

2007/1/26, t5in9tao [email protected]:

Super, c’est exactement ce que je voulais ! ^^
En plus c’est une méthode native à Ruby, bref c’est parfait.

Merci à vous.