Ruby不熟悉Integer.chr和";的字符串用法\001“;

Ruby不熟悉Integer.chr和";的字符串用法\001“;,ruby,Ruby,最近,我无意中发现了Ruby中的以下代码片段: @data = 3.chr * 5 结果是“\003\003\003\003\003” 例如,在代码的后面部分 flag = @data[2] & 2 使用, 我知道它要处理一些位标志。看起来值1、2和3被用作状态标志,但由于我熟悉的ruby 1.9版本更改了Integer.chr方法,代码不再工作,我很想知道发生了什么。 此外,“\00x”转义对象的目的是什么 感谢您的回答要使代码在Ruby 1.9中工作,请尝试将该行更改为: fla

最近,我无意中发现了Ruby中的以下代码片段:

@data = 3.chr * 5
结果是“\003\003\003\003\003”

例如,在代码的后面部分

flag = @data[2] & 2
使用, 我知道它要处理一些位标志。看起来值1、2和3被用作状态标志,但由于我熟悉的ruby 1.9版本更改了Integer.chr方法,代码不再工作,我很想知道发生了什么。 此外,“\00x”转义对象的目的是什么


感谢您的回答

要使代码在Ruby 1.9中工作,请尝试将该行更改为:

flag = @data[2].ord & 2
在Ruby 1.9之前,
str[n]
将返回一个介于0和255之间的整数,但在Ruby 1.9及其新的unicode支持中,
str[n]
将返回一个字符(长度为1的字符串)。要获取整数而不是字符,可以对字符调用
.ord

&
运算符只是C、Ruby和许多其他语言通用的标准位AND运算符

字节号3(0x03)不是可打印的ASCII字符,因此当您将该字节放入字符串并调用
inspect
时,ruby将该字节表示为
\003
。请确保您理解“\003”是单字节字符串,而“\003”是四字节字符串

在Ruby中,字符串实际上是字节序列。在Ruby 1.9中,也有编码信息,但它们实际上仍然只是一个字节序列。

值的八进制表示形式是“\00X”

因此,如果我们这样做:

irb(main):001:0> 15.chr
=> "\017"
irb(main):002:0> 16.chr
=> "\020"
注意到我们从17岁到20岁的过程了吗?八进制

“\003\003\003\003\003\003”是值3的5个字节,然后可以按位将它们与其他字节(如2或\002)相加

因此,二进制中与2(0010)AND的3或0011是2(0010)


出现1.9问题的原因是1.9没有像1.8那样使用ascii。大卫·格雷森很好地抓住了这一点

请注意,ruby 1.9将检查十六进制表示中的不可打印字符:

3.chr  # => "\x03"
更令人困惑的是,有时字符串将以unicode(UTF-8)显示:

表达式
3&2
是二进制数11b和10b的按位and,将产生10b(因为1&1表示最高有效位为1;1&0表示最低有效位为0)

其他转换:

'%x' % 97  # => '61' hex
0x61  # => 97 decimal from raw hex input
'%o' % 97  # => '141' octal
0141  # => 97 decimal from raw octal input

这是一个速成班,但你可能应该在谷歌上搜索更深入的信息。

谢谢你的回答,这正是我想要的:)thx是带八进制的音符,很高兴知道,但不完全是我的意图thx是非常好的解释,通过位运算符不是未知的。
"\003".unpack('B*')  # same as "\003".ord.to_s(2)
# => ["00000011"]  # the 2 least significant bits are set
2.to_s(2)  # convert to base 2
#=> "10"
'%x' % 97  # => '61' hex
0x61  # => 97 decimal from raw hex input
'%o' % 97  # => '141' octal
0141  # => 97 decimal from raw octal input