Cidr.cs 899 B

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