2012-07-18 78 views
2

在下面的示例代碼中,有人可以通過更詳細地解釋下面的行究竟在做什麼,就像你會向開發人員解釋它一樣。此Java代碼如何工作以轉換IP地址?

for (byte octet : octets) { 
     result <<= 8; 
     result |= octet & 0xff; 
    } 



public class Example { 
public static long ipToLong(InetAddress ip) { 
    byte[] octets = ip.getAddress(); 
    long result = 0; 
    for (byte octet : octets) { 
     result <<= 8; 
     result |= octet & 0xff; 
    } 
    return result; 
} 

public static void main(String[] args) throws UnknownHostException { 
    long ipLo = ipToLong(InetAddress.getByName("192.200.0.0")); 
    long ipHi = ipToLong(InetAddress.getByName("192.255.0.0")); 
    long ipToTest = ipToLong(InetAddress.getByName("192.200.3.0")); 

    System.out.println(ipToTest >= ipLo && ipToTest <= ipHi); 
} 

}

+1

替換'new BigInteger(ip.getAddress())。longValue()'。 – jtahlborn 2012-07-18 20:16:59

回答

1
  • byte[] octets = ip.getAddress(); - >存儲整個IP地址作爲字節數組

  • for (byte octet : octets) {} - >拆分字節數組成八位位組和遍歷它們

  • result <<= 8 (shorthand for result = result<<8) - >左移8位將結果轉換爲binar y乘以8位,並添加8個尾隨零。 (乘以2^8的結果的值)

  • result |= octet & 0xff; (same as result|=octet which is shorthand for result = result | or octect - >按位或運算,相同除了在這種情況下,因爲我們有在result端部8零,前面的步驟之後。

EDIT(感謝@jtahlborn) - >按位安定爲0xFF,必須避免符號擴展時,字節被轉換爲int。

192.200.3.0是有問題的IP地址。最終值是 這是通過以下方式產生現在

192*(2^24) + 200*(2^16) + 3*(2^8) + 0*(2^0) 
3221225472 + 13107200 + 768 = 3234333440 

你的代碼不相同,但使用逐轉移 192二進制是11000000。首先,它被添加到結果= 0; 結果現在是11000000。 然後,它被左移8位 結果爲11000000 00000000

查閱(由2^8有效地相乘),200二進制值,其11001000加入,使得結果現在11000000 11001000 該過程進行的,直到你有以下32位數字, 11000000 11001000 00000011 00000000這意味着相同的3234333440

+2

當字節轉換爲int時,0xFF是避免符號擴展所必需的。 – jtahlborn 2012-07-18 20:17:52

+0

我忘了!輝煌! – 2012-07-18 20:18:20

+0

@jtahlborn好的!甚至沒有想到, – 2012-07-18 20:18:58