2017-05-08 171 views
1

任何人都可以幫助我手動將整數轉換爲IP地址嗎?如何手動將整數轉換爲Ruby中的IP地址

我理解這個概念,但我正在努力弄清楚這個過程;號碼631271850,IP地址爲'37 .160.113.170'。

我知道,一個IP地址由四個八位和解決方案,我必須手動設置IP地址轉換成一個數字是:

def ip_to_num(ip_address) 
    array = ip_address.split('.').map(&:to_i) 
    ((array[0] * 2**24) + (array[1] * 2**16) + (array[2] * 2**8) + (array[3])) 
end 

要反過來做我百思不得其解。我如何將其轉換回來?

+1

什麼是反斜線做在那裏? '2 ** 2'是正確的符號。 – tadman

+1

爲什麼你不使用現有的類呢? Ruby帶有https://ruby-doc.org/stdlib-2.4.1/libdoc/ipaddr/rdoc/index.html,並有https://github.com/dspinhirne/netaddr-rb。 –

+0

Newby在這裏,所以請原諒我的錯誤。 – AshNaz87

回答

5

的IP只是代表一個4字節數組的32位整數:

[631271850].pack('N').unpack('CCCC').join('.') 
=> "37.160.113.170" 

只是爲了好玩,另一種方式的IP轉換爲int:

"37.160.113.170".split(".").map(&:to_i).pack('CCCC').unpack('N')[0] 
=> 631271850 
+0

謝謝!這非常感謝。 – AshNaz87

3

將IPv4地址轉換爲數字看起來很複雜。參考函數是inet_aton,它可以正確執行所有轉換。您也可以做到這一點在Ruby中探索不同的格式:

require 'socket' 

addrs = %w[ 
    1.2.3.4 
    1.2.3 
    1.2 
    1 
] 

addrs.each do |addr| 
    puts '%12s -> %08x' % [ 
    addr, 
    Socket.sockaddr_in(0, addr)[4,4].unpack('L>')[0] 
    ] 
end 

我們得到以下的輸出:

1.2.3.4 -> 01020304 
    1.2.3 -> 01020003 
    1.2 -> 01000002 
     1 -> 00000001 

1.2.31.2的案例或許不足爲奇。假定最後的值分別是16位值和24位值。不過,這些都是有效的IPv4地址。

如果你正在編寫你自己的,一定要處理那些奇怪的邊緣情況。

+1

如果你自己寫作,一定要檢查現有的,經過充分測試的班級是否已經不需要做什麼。 –