Skip to content

Commit 992f7ee

Browse files
authored
Rollup merge of #118505 - CLEckhardt:update_ip_addr_bits_docs, r=cuviper
Elaborate on ip_addr bit conversion endianness Adds explanation of how endianness is handled when converting `Ipv4Addr` and `Ipv6Addr` to and from bits. This is intended to unblock stabilization of the affected methods. Addresses #113744
2 parents 21982a4 + c3bb1b5 commit 992f7ee

File tree

1 file changed

+48
-4
lines changed

1 file changed

+48
-4
lines changed

library/core/src/net/ip_addr.rs

+48-4
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,13 @@ impl Ipv4Addr {
468468
#[unstable(feature = "ip_bits", issue = "113744")]
469469
pub const BITS: u32 = 32;
470470

471-
/// Converts an IPv4 address into host byte order `u32`.
471+
/// Converts an IPv4 address into a `u32` representation using native byte order.
472+
///
473+
/// Although IPv4 addresses are big-endian, the `u32` value will use the target platform's
474+
/// native byte order. That is, the `u32` value is an integer representation of the IPv4
475+
/// address and not an integer interpretation of the IPv4 address's big-endian bitstring. This
476+
/// means that the `u32` value masked with `0xffffff00` will set the last octet in the address
477+
/// to 0, regardless of the target platform's endianness.
472478
///
473479
/// # Examples
474480
///
@@ -479,6 +485,16 @@ impl Ipv4Addr {
479485
/// let addr = Ipv4Addr::new(0x12, 0x34, 0x56, 0x78);
480486
/// assert_eq!(0x12345678, addr.to_bits());
481487
/// ```
488+
///
489+
/// ```
490+
/// #![feature(ip_bits)]
491+
/// use std::net::Ipv4Addr;
492+
///
493+
/// let addr = Ipv4Addr::new(0x12, 0x34, 0x56, 0x78);
494+
/// let addr_bits = addr.to_bits() & 0xffffff00;
495+
/// assert_eq!(Ipv4Addr::new(0x12, 0x34, 0x56, 0x00), Ipv4Addr::from_bits(addr_bits));
496+
///
497+
/// ```
482498
#[rustc_const_unstable(feature = "ip_bits", issue = "113744")]
483499
#[unstable(feature = "ip_bits", issue = "113744")]
484500
#[must_use]
@@ -487,7 +503,9 @@ impl Ipv4Addr {
487503
u32::from_be_bytes(self.octets)
488504
}
489505

490-
/// Converts a host byte order `u32` into an IPv4 address.
506+
/// Converts a native byte order `u32` into an IPv4 address.
507+
///
508+
/// See [`Ipv4Addr::to_bits`] for an explanation on endianness.
491509
///
492510
/// # Examples
493511
///
@@ -1224,7 +1242,13 @@ impl Ipv6Addr {
12241242
#[unstable(feature = "ip_bits", issue = "113744")]
12251243
pub const BITS: u32 = 128;
12261244

1227-
/// Converts an IPv6 address into host byte order `u128`.
1245+
/// Converts an IPv6 address into a `u128` representation using native byte order.
1246+
///
1247+
/// Although IPv6 addresses are big-endian, the `u128` value will use the target platform's
1248+
/// native byte order. That is, the `u128` value is an integer representation of the IPv6
1249+
/// address and not an integer interpretation of the IPv6 address's big-endian bitstring. This
1250+
/// means that the `u128` value masked with `0xffffffffffffffffffffffffffff0000_u128` will set
1251+
/// the last segment in the address to 0, regardless of the target platform's endianness.
12281252
///
12291253
/// # Examples
12301254
///
@@ -1238,6 +1262,24 @@ impl Ipv6Addr {
12381262
/// );
12391263
/// assert_eq!(0x102030405060708090A0B0C0D0E0F00D_u128, u128::from(addr));
12401264
/// ```
1265+
///
1266+
/// ```
1267+
/// #![feature(ip_bits)]
1268+
/// use std::net::Ipv6Addr;
1269+
///
1270+
/// let addr = Ipv6Addr::new(
1271+
/// 0x1020, 0x3040, 0x5060, 0x7080,
1272+
/// 0x90A0, 0xB0C0, 0xD0E0, 0xF00D,
1273+
/// );
1274+
/// let addr_bits = addr.to_bits() & 0xffffffffffffffffffffffffffff0000_u128;
1275+
/// assert_eq!(
1276+
/// Ipv6Addr::new(
1277+
/// 0x1020, 0x3040, 0x5060, 0x7080,
1278+
/// 0x90A0, 0xB0C0, 0xD0E0, 0x0000,
1279+
/// ),
1280+
/// Ipv6Addr::from_bits(addr_bits));
1281+
///
1282+
/// ```
12411283
#[rustc_const_unstable(feature = "ip_bits", issue = "113744")]
12421284
#[unstable(feature = "ip_bits", issue = "113744")]
12431285
#[must_use]
@@ -1246,7 +1288,9 @@ impl Ipv6Addr {
12461288
u128::from_be_bytes(self.octets)
12471289
}
12481290

1249-
/// Converts a host byte order `u128` into an IPv6 address.
1291+
/// Converts a native byte order `u128` into an IPv6 address.
1292+
///
1293+
/// See [`Ipv6Addr::to_bits`] for an explanation on endianness.
12501294
///
12511295
/// # Examples
12521296
///

0 commit comments

Comments
 (0)