我在: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
:回复=>“\0\x5a\0\0\0\0\0\0”,
:数据=>数据[idx+9..-1]}
我不是在要求 ruby 习惯用法,而是在要求功能方面。
最佳答案
假设data
是一个字符串,unpack
方法定义在String#unpack
中.
v, c, port, o1, o2, o3, o4, user = data.unpack("CCnC4a*")
这会将字符串(通过读取字节,而不是将字符串解释为文本)转换为遵循以下规则的数组:
C
:将 8 位读取为无符号字符C
:将 8 位读取为无符号字符n
:读取16位无符号整数(大端格式)C4
:将 8 位读取为无符号字符(4 次)a*
:将所有剩余字节读取为任意字符串
因此我们得到一个包含 8 个条目的数组(7 个整数,1 个字符串)。数组中的每个条目都分配给变量 v
、c
、port
、o1
、o2
、o3
、o4
、用户
。
return { :close => "\0\x5b\0\0\0\0\0\0" } if v != 4 or c != 1
当v
不是4
并且c
不是1
时,返回哈希{:关闭=>“\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
,以便它包含 data
字符串中第一个空字节 ("\0"
) 的位置.
data[idx+9..-1]
返回 data
字符串的部分,从第一个空字节之后的 9 个字节开始,直到字符串末尾.
关于ruby - 了解字节解包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19024516/