Что лучший способ состоит в том, чтобы преобразовать от сетевого числа битов до сетевой маски?

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

Ng g c "componentname" --module app

, если ваш модуль называется app

8
задан bk1e 20 October 2008 в 14:43
поделиться

8 ответов

Почему напрасно тратят время с вычитанием или троичными операторами?

int suffix = 24;
int mask = 0xffffffff ^ 0xffffffff >> suffix;

Если Вы знаете, что Ваше целое число точно 32 бита длиной затем, Вам только нужно к типу 0xffffffff однажды.

int32_t mask = ~(0xffffffff >> suffix);

Обе компиляции к тому же самому ассемблерному коду.

1
ответ дан 5 December 2019 в 15:28
поделиться

Это не вопрос о программировании, но в Linux можно использовать whatmask.

whatmask 72.20.10.0/24

возвраты

IP Entered = ..................: 72.20.10.0
CIDR = ........................: /24
Netmask = .....................: 255.255.255.0
Netmask (hex) = ...............: 0xffffff00
Wildcard Bits = ...............: 0.0.0.255
------------------------------------------------
Network Address = .............: 72.20.10.0
Broadcast Address = ...........: 72.20.10.255
Usable IP Addresses = .........: 254
First Usable IP Address = .....: 72.20.10.1
Last Usable IP Address = ......: 72.20.10.254
1
ответ дан 5 December 2019 в 15:28
поделиться

Я всегда делаю это как этот (в Вашем случае cidr = 24):

uint32_t ipv4Netmask;

ipv4Netmask = 0xFFFFFFFF;
ipv4Netmask <<= 32 - cidr;
ipv4Netmask = htonl(ipv4Netmask);

Это будет только работать с ipv4Netmask, чтобы быть на самом деле uint32_t, не делайте его интервалом, поскольку интервал не должен быть 32, Обдумал каждую систему. Результат преобразовывается в сетевой порядок байтов, поскольку это - то, что ожидает большинство системных функций.

Обратите внимание, что этот код перестанет работать если cidr нуль как затем, код сместил бы переменную на 32 бита на 32 бита и, хотите верьте, хотите нет, это - неопределенное поведение в C. Можно было бы ожидать, что результатом всегда будет нуль, но в стандарте C говорится, что это не определяется для начала. Если бы Ваш CIDR может быть нулем (который был бы только позволен в любом заполнителе IP-адреса 0.0.0.0/0), то код должен поймать особый случай.

3
ответ дан 5 December 2019 в 15:28
поделиться

Принятие 32-разрядной маски и 32-разрядного интервала.

int keepBits = 24;  /* actually get it from somewhere else? */

int mask = (0xffffffff >> (32 - keepBits )) << (32 - keepBits);

Примечание: это - не обязательно ответ на вопрос, "Что лучший способ состоит в том, чтобы получить сетевую маску для интерфейса?"

7
ответ дан 5 December 2019 в 15:28
поделиться
int keepbits = 24;
int mask = keepbits > 0 ? 0x00 - (1<<(32 - keepbits)) : 0xFFFFFFFF;
1
ответ дан 5 December 2019 в 15:28
поделиться

Вы могли попробовать что-то простое, как взятие числа битов и деление на 4. Это дало бы Вам ведущий F в маске. И затем возьмите остаток и имейте переключатель от 0 битов до 3 битов.

-1
ответ дан 5 December 2019 в 15:28
поделиться

Вот решение в VBScript, FWIW

option explicit

'whatmask 72.20.10.0/24
If WScript.Arguments.Unnamed.Count < 1 Then
    WScript.Echo "WhatMask xxx.xxx.xxx.xxx/xx"
    Wscript.Quit
End If

Dim sToFind
Dim aParts
Dim nSubnet

sToFind = WScript.Arguments(0)
aParts = Split( sToFind, "/", 2 )
nSubnet = aParts(1)

if nSubnet < 1 or nSubnet > 32 then
  WScript.echo "Subnet out of range [1..32]"
  Wscript.quit
end if

Dim sBinary
sBinary = String( nSubnet, "1")
sBinary = sBinary & String( 32 - nSubnet, "0" )

wscript.echo "0x" & lcase( binary2hexadecimal( sBinary ) )

function binary2hexadecimal( sBin )
  dim sSlice
  dim sResult
  dim i
  for i = 1 to len( sBin ) step 4
    sSlice = mid( sBin, i, 4 )
    sResult = sResult & hex( binary2decimal( sSlice ) )
  next
  binary2hexadecimal = sResult
end function

function binary2decimal( sFourbits )
  dim i
  dim bit
  dim nResult
  nResult = 0
  for i = 4 to 1 step -1
    bit = mid(sFourbits, i, 1 )
    nResult = nResult * 2 + bit
  next
  binary2decimal = nResult
end function

Из командной строки

>whatmask.vbs 123.12.123.17/23
 0xfffff700
0
ответ дан 5 December 2019 в 15:28
поделиться
/* C# version merging some of the other contributions and corrected for byte order. */

int cidr = 24;

var ipv4Netmask = 0xFFFFFFFF;

ipv4Netmask <<= 32 - cidr;

byte[] bytes = BitConverter.GetBytes(ipv4Netmask);

Array.Reverse(bytes);

ipv4Netmask = BitConverter.ToUInt32(bytes, 0);    

// mask is now ready for use such as:

var netmask = new IPAddress(ipv4Netmask);
-1
ответ дан 5 December 2019 в 15:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: