Вычисление номера подсети по IP-адресу и маске подсети в C # - PullRequest
1 голос
/ 16 декабря 2011

У меня есть задача для завершения в C #. У меня есть:

IP-адрес: 192.168.1.57 и Маска подсети: 255.255.0.0

Мне нужно найти номер подсети, который в данном случае будет 192.168.0.0.

Однако мне нужно быть в состоянии сделать это в C # БЕЗ использования библиотеки System.Net (система, в которой я программирую, не имеет доступа к этой библиотеке).

Кажется, что процесс должен выглядеть примерно так:

1) Разделить IP-адрес на октеты

2) Разделить маску подсети на октеты

3) Октет номера подсети 1 = октет IP-адреса 1, дополненный октетом маски подсети 1

4) Октет номера подсети 2 = октет IP-адреса 2, добавленный с октетом маски подсети 2

5) Октет номера подсети 3 = октет IP-адреса 3, добавленный в октет маски подсети 3

6) Октет номера подсети 4 = октет IP-адреса 4, добавленный в октет маски подсети 4

7) Присоединиться к октету номера подсети 1 +. + Номер подсети октет 2 +. + Номер подсети октет 3 +. + Номер подсети октет 4

8) Вуаля!

Однако мой C # довольно плохой. У кого-нибудь есть знания C #, чтобы помочь?

Ответы [ 2 ]

5 голосов
/ 16 декабря 2011

Это должно выполнить процедуру, которую вы описали.

string ipAddress = "192.168.1.57";
string subNetMask = "255.255.0.0";

string[] ipOctetsStr = ipAddress.Split('.');
string[] snOctetsStr = subNetMask.Split('.');

if (ipOctetsStr.Length != 4 || snOctetsStr.Length != 4)
{
   throw new ArgumentException("Invalid input strings.");
}

string[] resultOctets = new string[4];
for (int i = 0; i < 4; i++) 
{
    byte ipOctet = Convert.ToByte(ipOctetsStr[i]);
    byte snOctet = Convert.ToByte(snOctetsStr[i]);
    resultOctets[i] = (ipOctet & snOctet).ToString();
}

string resultIP = string.Join(".", resultOctets);
1 голос
/ 16 декабря 2011

Простите мой VB-код, но он почти идентичен:

    Dim foo As Net.IPAddress = Net.IPAddress.Parse("192.168.1.57")
    Dim bar As Net.IPAddress = Net.IPAddress.Parse("255.255.0.0")

    Dim fooA() As Byte = foo.GetAddressBytes
    Dim barA() As Byte = bar.GetAddressBytes

    Array.Reverse(fooA)
    Array.Reverse(barA)

    Dim fooNum As Integer = BitConverter.ToInt32(fooA, 0)
    Dim barNum As Integer = BitConverter.ToInt32(barA, 0)

    Dim netNum As Integer = fooNum And barNum
    Dim netNumA() As Byte = BitConverter.GetBytes(netNum)
    Array.Reverse(netNumA)

    Dim subNet As New Net.IPAddress(netNumA)
...