Как преобразовать маску подсети CIDR в формат HEX?

2

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");
  • 1
    Больше связано с вашей проблемой (я думаю): что, по вашему мнению, делает IPAddress.HostToNetworkOrder ?
  • 0
    @elgonzo тогда я получаю значение с двумя нулями FFFFFE00
Показать ещё 6 комментариев
Теги:
winforms
hex
netmask

1 ответ

1
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню