ruby - 了解字节解包

标签 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

:回复=>“\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 个字符串)。数组中的每个条目都分配给变量 vcporto1o2o3o4用户

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/

相关文章:

ruby - ==~ 运算符是做什么的?

javascript - 用于实时多人游戏的 Node.js UDP

java - java中的ip地址

grails - Grails Twitter Bootstrap Modal以服务器端方式加载内容

dart - 如何创建Dart Server数据库?

javascript - 预编译rails-3 Assets 管道,使javascript失败,阻止heroku部署

arrays - 如何过滤数组中既匹配某个模式又不匹配第二个模式的元素?

c# - 用于 HTTP 基本身份验证的 UnityWebRequest 嵌入用户 + 密码数据在 Android 上不起作用

php - "var_dump"函数

ruby - Xpath:所有节点直到一个节点(Wikiquote.org)