]> git.lizzy.rs Git - rust.git/commitdiff
Add functions to convert IPv4 to long and back
authorAbhishek Chanda <abhishek@cloudscaling.com>
Tue, 21 Apr 2015 03:37:58 +0000 (20:37 -0700)
committerAbhishek Chanda <abhishek@cloudscaling.com>
Mon, 4 May 2015 02:08:53 +0000 (19:08 -0700)
src/libstd/net/ip.rs

index 065126c6fdbb564ea0fa30d338f895d2917754f8..b40d56280410262bc871a85a248feae09e585afe 100644 (file)
@@ -171,7 +171,6 @@ pub fn to_ipv6_mapped(&self) -> Ipv6Addr {
                       ((self.octets()[0] as u16) << 8) | self.octets()[1] as u16,
                       ((self.octets()[2] as u16) << 8) | self.octets()[3] as u16)
     }
-
 }
 
 #[stable(feature = "rust1", since = "1.0.0")]
@@ -244,6 +243,21 @@ fn from_inner(addr: libc::in_addr) -> Ipv4Addr {
     }
 }
 
+#[stable(feature = "ip_u32", since = "1.1.0")]
+impl From<Ipv4Addr> for u32 {
+    fn from(ip: Ipv4Addr) -> u32 {
+        let ip = ip.octets();
+        ((ip[0] as u32) << 24) + ((ip[1] as u32) << 16) + ((ip[2] as u32) << 8) + (ip[3] as u32)
+    }
+}
+
+#[stable(feature = "ip_u32", since = "1.1.0")]
+impl From<u32> for Ipv4Addr {
+    fn from(ip: u32) -> Ipv4Addr {
+        Ipv4Addr::new((ip >> 24) as u8, (ip >> 16) as u8, (ip >> 8) as u8, ip as u8)
+    }
+}
+
 impl Ipv6Addr {
     /// Creates a new IPv6 address from eight 16-bit segments.
     ///
@@ -738,4 +752,16 @@ fn to_socket_addr_socketaddr() {
         let a = sa4(Ipv4Addr::new(77, 88, 21, 11), 12345);
         assert_eq!(Ok(vec![a]), tsa(a));
     }
+
+    #[test]
+    fn test_ipv4_to_int() {
+        let a = Ipv4Addr::new(127, 0, 0, 1);
+        assert_eq!(u32::from(a), 2130706433);
+    }
+
+    #[test]
+    fn test_int_to_ipv4() {
+        let a = Ipv4Addr::new(127, 0, 0, 1);
+        assert_eq!(Ipv4Addr::from(2130706433), a);
+    }
 }