Как преобразовать маску подсети CIDR в формат HEX? - PullRequest
2 голосов
/ 31 марта 2019

Подскажите, как получить значение, равное FFFFFFFE, получается вывод только EFFFF в обратном порядке и без первых двух символов FF

Исходный код: Преобразованиенотация «/» маски подсети по стандарту Cisco 0.0.0.0

var cidr = 23;
var zeroBits = 32 - cidr;
var result = uint.MaxValue;

result &= (uint)((((ulong)0x1 << cidr) - 1) << zeroBits);
result = (uint)IPAddress.HostToNetworkOrder((int)result);

textBoxHex.Text = result.ToString("X");

1 Ответ

1 голос
/ 31 марта 2019

Одно возможное решение, используя класс BitVector32 для создания массива битов из длины в битах сетевой маски.

Этой битовой маски, возвращаемой BitVector32, будет достаточно,если вы просто хотите напечатать шестнадцатеричное представление.
Предположим, вы также хотите представить адрес в формате IPV4.В этом случае маска сети, конечно, инвертируется.Чтобы преобразовать его в действительное IpAddress, нам нужно инвертировать порядок байтов.

IPAddress.HostToNetworkOrder не будет напрямую преобразовывать в сетевой порядок байтов значение, возвращаемое свойством BitVector32.Data.
Мы можем использовать BitConverter.GetBytes иArray.Reverse() или метод LINQ .Reverse(), чтобы сделать то же самое.

Это все, что нужно:

int cidr = 23;
var bits = new BitVector32(-1 << (32 - cidr));

Чтобы вернуть HEX-представление битовой маски, просто преобразуйте его в строку, указав формат Hex:
Форматирование типов в.NET (MSDN)

Console.WriteLine(bits.Data.ToString("X2"));
=> FFFFFE00

Чтобы преобразовать его в формат IpAddress, если необходимо:

var bytes = BitConverter.GetBytes((uint)bits.Data);
var netMask = new IPAddress(bytes.Reverse().ToArray());

Console.WriteLine(netMask); 
=> 255.255.254.0
...