【问题标题】:Understanding bytes unpack理解字节解包
【发布时间】:2013-09-26 09:34:27
【问题描述】:

我在以下位置找到了这样的代码: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 =&gt; "\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​​ 习语,而是功能方面。

【问题讨论】:

标签: ruby networking server-side


【解决方案1】:

假设data是一个String,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 个整数,一个字符串)的数组。数组中的每个条目都分配给变量vcporto1o2o3o4user

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

v 不是4 并且c 不是1 时,返回哈希{ :close =&gt; "\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 个字节开始直到字符串结尾的部分。

【讨论】:

  • 感谢您的精彩回答! "\0\x5b\0\0\0\0\0\0" 到底是什么意思?
  • "\0\x5b\0\0\0\0\0\0" 是一个包含大量空字节 (\0) 和字节 0x5b 的字符串。
猜你喜欢
  • 2011-04-20
  • 2010-12-05
  • 1970-01-01
  • 2019-12-22
  • 2020-01-28
  • 2017-12-26
  • 2023-03-27
  • 2020-07-17
相关资源
最近更新 更多