web-dev-qa-db-fra.com

Ruby: créer une chaîne à partir d'octets

Je voudrais construire une chaîne à partir d'une valeur d'octet.

J'utilise actuellement:

str = " "
str[0] = byte

Cela semble fonctionner correctement mais je le trouve moche et pas très évolutif pour les chaînes de plus d'un caractère.

Une idée?

40
Vincent Robert

Il existe une approche beaucoup plus simple que toutes les solutions ci-dessus: Array # pack :

>> [65,66,67,68,69].pack('c*')
=>  "ABCDE"

Je crois que pack est implémenté en c dans matz Ruby, il sera donc également beaucoup plus rapide avec de très grands tableaux.

De plus, le pack peut gérer correctement UTF-8 en utilisant le modèle 'U *'.

61
Jason Watkins

pour 1.9 vous avez besoin de:

[195,164].pack('c*').force_encoding('UTF-8')
19
grosser

ne me souviens pas s'il y a une seule fonction qui fait ça:

>> a = [65,66,67]
=> [65, 66, 67]
>> a.map {|x| x.chr}.join
=> "ABC"
8
nonopolarity

Si les octets sont un tableau de Fixnum, vous pouvez essayer ceci:

bytes.map {|num| num.chr}.join

ou ca:

s = ''
bytes.each {|i| s << i}
3
hyperlogic