2

我在以下位置找到了这样的代码: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] }

我不是要 ruby​​ 成语,而是要功能方面。

4

1 回答 1

4

假设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 个整数,一个字符串)的数组。数组中的每个条目都分配给变量v, c, port, o1, o2, o3, o4, user

return { :close => "\0\x5b\0\0\0\0\0\0" }  if v != 4 or c != 1

vis not4cis not1时,返回散列{ :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]返回从data第一个空字节之后的 9 个字节开始到字符串结尾的字符串部分。

于 2013-09-26T10:05:23.637 回答