Ruby:从字节创建字符串

Ruby:从字节创建字符串,ruby,string,byte,Ruby,String,Byte,我想从字节值构建一个字符串 我目前使用: str = " " str[0] = byte 这似乎工作得很好,但我发现它很难看,对于长度超过1个字符的字符串,它的可伸缩性不是很好 有什么想法吗?如果字节是Fixnum的数组,您可以尝试以下方法: bytes.map {|num| num.chr}.join 或者这个: s = '' bytes.each {|i| s << i} s='' bytes.each{i|s不记得是否有一个函数可以执行此操作: >> a =

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

我目前使用:

str = " "
str[0] = byte
这似乎工作得很好,但我发现它很难看,对于长度超过1个字符的字符串,它的可伸缩性不是很好


有什么想法吗?

如果字节是Fixnum的数组,您可以尝试以下方法:

bytes.map {|num| num.chr}.join
或者这个:

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

bytes.each{i|s不记得是否有一个函数可以执行此操作:

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

有一种比上述方法简单得多的方法:

我相信pack是在matzruby中用c实现的,所以它在非常大的阵列中也会更快

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

对于1.9,您需要:

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

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

c = 65
=> 65
c.chr
=> "A"
c.chr.class
=> String

很好,我不知道chrmethod@VincentRobert你怎么能用那种风格做这个例子呢?
[195164].pack('c*').force_编码('UTF-8')
明白了:
[195164].map{x | x.chr}.join.force_编码('UTF-8')
更简洁:
a.map(&:chr).join
这个答案描述了正确的方法。但是请记住,按照grosser的答案,在Ruby 1.9中正确设置编码!小写字母
c*
让你“幸运”。你真的想要
c*
。请参阅:
c
代表“8位有符号(有符号字符)”,
c
代表“8位无符号(无符号字符)”Pack无法使用“U*”模板正确处理UTF-8。这是不正确的。“U*”打包的是Unicode代码点数组,而不是UTF8字节。@A.Wilson请参阅注释中的示例,因为我确实看到了这一点,我特别想知道它是否与Pack(而不是unpack)有所不同。这对于避免混淆仍然很重要,我认识到,我只是想知道这是否是我建议使用
C*
的唯一原因,因为您需要无符号整数。
C*
用于有符号整数。请注意:
“ä”。unpack('C*')
=
[-61,-92]
。您需要的是:
“ä”。unpack('C*'))
==
[195164]
c = 65
=> 65
c.chr
=> "A"
c.chr.class
=> String