Ruby:从字节创建一个String

Vin*_*ert 39 ruby string byte

我想从字节值构建一个字符串.

我目前使用:

str = " "
str[0] = byte
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,但我觉得它很难看,并且不能很好地扩展到超过1个字符的字符串.

任何的想法?

Jas*_*ins 59

有一种比上述任何方法更简单的方法:Array#pack:

>> [65,66,67,68,69].pack('c*')
=>  "ABCDE"
Run Code Online (Sandbox Code Playgroud)

我相信pack是用matz ruby​​中的c实现的,所以对于非常大的数组,它也会快得多.

另外,pack可以使用'U*'模板正确处理UTF-8.

  • 你用小写的`c*`得到了'幸运'.你真的想要`C*`.请参阅:http://www.ruby-doc.org/core-1.9.3/Array.html`c`表示"8位有符号(有符号字符串)","C"代表"8位无符号("无符号的字符)" (8认同)
  • Pack无法使用"U*"模板正确处理UTF-8.这是不正确的."U*"打包一个Unicode代码点数组,而不是UTF8字节. (4认同)

gro*_*ser 19

对于1.9你需要:

[195,164].pack('c*').force_encoding('UTF-8')
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用`C*`,因为你想要无符号整数.`c*`用于有符号整数.注意:`"ä".unpack('c*')`==`[ - 61,-92]`.你想要的是:`"ä".unpack('C*')`==`[195,164]` (9认同)

nop*_*ole 7

不记得是否有一个功能可以做到这一点:

>> a = [65,66,67]
=> [65, 66, 67]
>> a.map {|x| x.chr}.join
=> "ABC"
Run Code Online (Sandbox Code Playgroud)

  • 更紧凑:`a.map(&:chr).join` (3认同)