理解字节解压缩

时间:2013-09-26 09:34:27

标签: ruby networking server-side

我在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] }

我不是要求红宝石成语,而是要求功能方面。

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个整数,一个字符串)。数组中的每个条目都分配给变量vcporto1o2o3,{{ 1}},o4

user

return { :close => "\0\x5b\0\0\0\0\0\0" } if v != 4 or c != 1 不是v4不是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个字节开始直到字符串结尾的部分。