我在https://github.com/mojombo/proxymachine/
中找到了这样的代码proxy do |data|
return if data.size < 9
v, c, port, o1, o2, o3, o4, user = data.unpack("CCnC4a*")
return { :close => "\0\x5b\0\0\0\0\0\0" } if v != 4 or c != 1
return if ! idx = user.index("\0")
{ :remote => "#{[o1,o2,o3,o4]*'.'}:#{port}",
:reply => "\0\x5a\0\0\0\0\0\0",
:data => data[idx+9..-1] }
end
这段代码有什么作用?特别是这些行:
data.unpack("CCnC4a*")
return { :close => "\0\x5b\0\0\0\0\0\0" } if v != 4 or c != 1
:reply => "\0\x5a\0\0\0\0\0\0",
:data => data[idx+9..-1] }
我不是要求红宝石成语,而是要求功能方面。
答案 0 :(得分:4)
假设data
是一个字符串,unpack
方法在String#unpack
中定义。
v, c, port, o1, o2, o3, o4, user = data.unpack("CCnC4a*")
这会将遵循以下规则的字符串(通过读取字节,不将字符串解释为文本)转换为数组:
C
:将8位读取为unsigned char C
:将8位读取为unsigned char n
:读取16位无符号整数(采用big-endian格式)C4
:将8位读取为无符号字符(4次)a*
:将所有剩余字节读为任意字符串所以我们得到一个包含8个条目的数组(7个整数,一个字符串)。数组中的每个条目都分配给变量v
,c
,port
,o1
,o2
,o3
,{{ 1}},o4
。
user
当return { :close => "\0\x5b\0\0\0\0\0\0" } if v != 4 or c != 1
不是v
且4
不是c
时,请返回哈希1
。
方法返回其最后一个语句的结果。你的方法的最后一个陈述是
{ :close => "\0\x5b\0\0\0\0\0\0" }
这是一个包含三个键的哈希({ :remote => "#{[o1,o2,o3,o4]*'.'}:#{port}",
:reply => "\0\x5a\0\0\0\0\0\0",
:data => data[idx+9..-1] }
,:remote
,:reply
)。在之前的语句中,我们分配了:data
,以便它包含idx
字符串中第一个空字节("\0"
)的位置。
data
返回data[idx+9..-1]
字符串中从第一个空字节后的9个字节开始直到字符串结尾的部分。