Ruby: создать строку из байтов - PullRequest
39 голосов
/ 07 июня 2009

Я хотел бы построить строку из байтового значения.

Я сейчас использую:

str = " "
str[0] = byte

Кажется, это работает нормально, но я нахожу это уродливым и не очень масштабируемым для строк длиной более 1 символа.

Есть идеи?

Ответы [ 4 ]

59 голосов
/ 07 июня 2009

Существует гораздо более простой подход, чем любой из вышеперечисленных: Array # pack :

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

Я считаю, что pack реализован на языке c в matz ruby, поэтому он также будет значительно быстрее с очень большими массивами.

Также пакет может корректно обрабатывать UTF-8 с помощью шаблона 'U *'.

15 голосов
/ 15 января 2011

для 1.9 вам нужно:

[195,164].pack('c*').force_encoding('UTF-8')
7 голосов
/ 07 июня 2009

не могу вспомнить, если есть одна функция, которая делает это:

>> a = [65,66,67]
=> [65, 66, 67]
>> a.map {|x| x.chr}.join
=> "ABC"
3 голосов
/ 07 июня 2009

Если байты являются массивом Fixnum, вы можете попробовать это:

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

или это:

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