2013-09-26 65 views
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] }

我不要求紅寶石成語,但對於功能性的一面。

+0

這可能有所幫助:http://stackoverflow.com/questions/14293926/how-does-pack-and-unpack-work-in-ruby但不是重複的國際海事組織。 –

回答

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位爲unsigned char(4次)
  • a*:讀取所有其餘的字節作爲一個任意字符串

因此,我們得到包含8個條目(7個整數,一個字符串)的陣列。在陣列中的那些條目中的每一個被分配給變量vcporto1o2o3,,user

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

v4c1,返回哈希{ :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,以便它包含data字符串中第一個空字節("\0")的位置。

data[idx+9..-1]返回data字符串的一部分,從第一個空字節後面的9個字節開始,直到字符串結尾。

+0

非常感謝您的支持!究竟「\ 0 \ x5b \ 0 \ 0 \ 0 \ 0 \ 0 \ 0」是什麼意思? –

+1

'「\ 0 \ x5b \ 0 \ 0 \ 0 \ 0 \ 0 \ 0」是一個包含大量空字節('\ 0')和字節'0x5b'的字符串。 – tessi