FFFFFFFE
как получить значение, равное 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");
Одно из возможных решений - использование класса BitVector32 для создания массива битов по длине в битах маски сети.
Битовая маска, возвращаемая BitVector32
, будет достаточно, если вы просто хотите распечатать представление Hex.
Предположим, вы также хотите представить адрес в формате 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
(bits.Data.ToString("X2")
но не понимаю, почему "X2". Благодарен за ваше время, потраченное на написание множества опций!
X
и x =>
Преобразовать в шестнадцатеричную строку в верхнем или нижнем регистре: 15.ToString("X") => F
, 15.ToString("x") => f
. X2
или x2
=> все значения представлены двумя символами: 15.ToString("X2") => 0F
а не только F
IPAddress.HostToNetworkOrder
?FFFFFE00