2009-06-06 15 views
36

Me gustaría construir una cadena a partir de un valor de byte.Ruby: crea una cadena de bytes

Actualmente uso:

str = " " 
str[0] = byte 

Esto parece funcionar bien, pero me resulta desagradable y no muy escalable a cadenas de más de 1 carácter.

¿Alguna idea?

Respuesta

51

Hay un enfoque mucho más simple que ninguno de los anteriores: Array#pack:

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

Creo que el paquete está implementado en c en matz ruby, por lo que también será considerablemente más rápido con arreglos muy grandes.

Además, el paquete puede manejar correctamente UTF-8 usando la plantilla 'U *'.

+0

Esta respuesta describe la forma correcta de hacerlo. ¡Pero recuerde establecer la codificación correctamente en Ruby 1.9 como la respuesta más gruesa! – severin

+8

Tienes 'suerte' con la letra minúscula 'c * '. Realmente quieres 'C *'. Ver: http://www.ruby-doc.org/core-1.9.3/Array.html 'c' es para" 8-bit signed (signed char) ",' C' es para "8-bit unsigned (char sin signo) " –

+4

El paquete NO puede manejar UTF-8 correctamente usando la plantilla" U * ". Esto es incorrecto. "U *" contiene una matriz de puntos de código Unicode, no bytes UTF8. – stephenjudkins

3

Si bytes es una matriz de Fixnum de usted podría intentar esto:

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

o esto:

s = '' 
bytes.each {|i| s << i} 
5

No puedo recordar si hay una sola función que hace que:

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

Niza, no sabía sobre el método CHR –

+0

@VincentRobert Cómo se puede/se puede hacer este ejemplo en ese estilo? '[195,164] .pack ('c *'). Force_encoding ('UTF-8')' –

+0

Entendido: '[195,164] .map {| x | x.chr} .join.force_encoding ('UTF-8') ' –

15

de 1,9 que necesita:

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

. Recomiendo usar 'C *' porque quiere enteros sin signo. 'c *' es para enteros con signo. Tenga en cuenta que: '" ä ".unpack ('c *')' == '[-61, -92]'. Lo que quiere es: '" ä ".unpack ('C *')' == '[195, 164]' –

Cuestiones relacionadas