Если у вас есть несколько модулей, вы должны указать, какой из них вы добавляете компонент. Например:
Ng g c "componentname" --module app
, если ваш модуль называется app
Почему напрасно тратят время с вычитанием или троичными операторами?
int suffix = 24;
int mask = 0xffffffff ^ 0xffffffff >> suffix;
Если Вы знаете, что Ваше целое число точно 32 бита длиной затем, Вам только нужно к типу 0xffffffff однажды.
int32_t mask = ~(0xffffffff >> suffix);
Обе компиляции к тому же самому ассемблерному коду.
Это не вопрос о программировании, но в 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
Я всегда делаю это как этот (в Вашем случае 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), то код должен поймать особый случай.
Принятие 32-разрядной маски и 32-разрядного интервала.
int keepBits = 24; /* actually get it from somewhere else? */
int mask = (0xffffffff >> (32 - keepBits )) << (32 - keepBits);
Примечание: это - не обязательно ответ на вопрос, "Что лучший способ состоит в том, чтобы получить сетевую маску для интерфейса?"
int keepbits = 24;
int mask = keepbits > 0 ? 0x00 - (1<<(32 - keepbits)) : 0xFFFFFFFF;
Вы могли попробовать что-то простое, как взятие числа битов и деление на 4. Это дало бы Вам ведущий F в маске. И затем возьмите остаток и имейте переключатель от 0 битов до 3 битов.
Вот решение в 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
/* 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);