Cidr.cs 891 B

12345678910111213141516171819202122232425262728293031
  1. namespace RackPeek.Domain.Resources.Services.Networking;
  2. public readonly struct Cidr {
  3. public uint Network { get; }
  4. public uint Mask { get; }
  5. public int Prefix { get; }
  6. public Cidr(uint network, uint mask, int prefix) {
  7. Network = network;
  8. Mask = mask;
  9. Prefix = prefix;
  10. }
  11. public bool Contains(uint ip) => (ip & Mask) == Network;
  12. public override string ToString() => $"{IpHelper.ToIp(Network)}/{Prefix}";
  13. public static Cidr Parse(string cidr) {
  14. var parts = cidr.Split('/');
  15. if (parts.Length != 2)
  16. throw new ArgumentException($"CIDR must be in format a.b.c.d/nn: {cidr}");
  17. var ip = IpHelper.ToUInt32(parts[0]);
  18. var prefix = int.Parse(parts[1]);
  19. var mask = IpHelper.MaskFromPrefix(prefix);
  20. var network = ip & mask;
  21. return new Cidr(network, mask, prefix);
  22. }
  23. }