IP Address Math

Too frequently the existing implementation of the C# IPAddress object is too limited for anything beyond some of the most trivial interactions. Mathematical operations in fact are wholly absent, forcing developers to directly manipulate bytes 1, often requiring a great deal of manual implementation of non-existent byte math. Don’t worry though, Arcus is here to fill in some of those gaps.

Note

Unless otherwise specified regarding the math of the IPAddress object treats it as an unsigned integer based on its bytes interpenetrated as 32-bit for IPv4 and 128-bit for IPv6 all in big-endian byte order.

Increment

Incrementing an IPAddress allows for the the addition or subtraction of a provided optional long delta value.

There exist two implementations of Increment methods. Increment and the safe TryIncrement.

public static IPAddress Increment(this IPAddress input, long delta = 1)
public static bool TryIncrement(IPAddress input, out IPAddress address, long delta = 1)

Comparisons

Compare to Another IPAddress

The IPAddress does not implement the standard comparison operators, and thus far we can’t write extension methods for operators on a class 2. Arcus did the next best thing, deciding not to extend the IPAddress, opting to provide a handful of simple extension methods to bend the will of the IPAddress to suit our needs.

Note

Barring the use of the methods below, the DefaultIPAddressComparer may also be of interest to you.

It should be pretty obvious based on name alone as to what each of the following five methods will accomplish:

public static bool IsEqualTo(this IPAddress left, IPAddress right)
public static bool IsGreaterThan(this IPAddress left, IPAddress right)
public static bool IsGreaterThanOrEqualTo(this IPAddress left, IPAddress right)
public static bool IsLessThan(this IPAddress left, IPAddress right)
public static bool IsLessThanOrEqualTo(this IPAddress left, IPAddress right)

Get IsBetween

Slightly different than the other comparison extension method above is the IsBetween method. As is hopefully is obvious it will test if an IPAddress occurs numerically between the given high and low addresses. Likewise the inclusive bit may be set to include equality to either low or high to be considered an inclusive between.

public static bool IsBetween(this IPAddress input, IPAddress low, IPAddress high, bool inclusive = true)

Get Min / Max

The Min and Max methods will return the IPAddress left or IPAddress right that is the smallest or largest of the two respectively.

public static IPAddress Min(IPAddress left, IPAddress right)
public static IPAddress Max(IPAddress left, IPAddress right)

Determine Scale

IsAtMin and IsAtMax tests the IPAddress address to determine if it is at its minimum or maximum value respectively.

Note

For IPv4 the minimum value is 0.0.0.0 (\(0\)), and maximum is 255.255.255.255 (\(2^{32}-1\))

Note

For IPv6 the minimum value is :: (\(0\)), and maximum is ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff (\(2^{128}-1\))

public static bool IsAtMin(this IPAddress address)
public static bool IsAtMax(this IPAddress address)

Footnotes

1

If you actually want to manipulate bytes take a gander at Gulliver, an C# library developed by the same folks that wrote Arcus. They’re kinda great.

2

A GitHub issue for Extension function members requesting a champion for some proposed changes regarding the future of extension methods.