44

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

我目前使用:

str = " "
str[0] = byte

这似乎工作正常,但我发现它很难看,并且对于长度超过 1 个字符的字符串的扩展性不是很好。

任何的想法?

4

5 回答 5

68

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

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

我相信 pack 是在 matz ruby​​ 中用 c 实现的,因此对于非常大的数组,它也会相当快。

此外,pack 可以使用“U*”模板正确处理 UTF-8。

于 2009-06-07T02:33:07.457 回答
21

对于 1.9,您需要:

[195,164].pack('c*').force_encoding('UTF-8')
于 2011-01-15T20:26:31.940 回答
10

不记得是否有一个函数可以做到这一点:

>> a = [65,66,67]
=> [65, 66, 67]
>> a.map {|x| x.chr}.join
=> "ABC"
于 2009-06-06T23:02:33.483 回答
4

如果 bytes 是 Fixnum 的数组,你可以试试这个:

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

或这个:

s = ''
bytes.each {|i| s << i}
于 2009-06-06T22:51:11.807 回答
0

这不是 OP 的问题,但是如果您只有一个字节(不在数组中)并且想从中创建一个字符串,请使用chr

c = 65
=> 65
c.chr
=> "A"
c.chr.class
=> String
于 2020-11-18T17:37:57.280 回答