Na przykład, jeśli mam specyfikację sieci, taką jak 172.20.10.0/24, "24" to bitcount. Jaki jest najlepszy sposób przekonwertowania tego na maskę sieci, np. 0xffffff00?Jaki jest najlepszy sposób na konwersję z sieci bitcount na netmask?
Odpowiedz
To nie jest pytanie programistyczne, ale w Linuksie możesz użyć whatmask.
whatmask 72.20.10.0/24
powraca
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
[whatmask source code] (http://www.laffeycomputer.com/whatmask.html) –
Można spróbować coś prostego, jak poświęcenie bitcount i dzieląc przez 4. Że daje wiodącym F jest w masce. A następnie weź resztę i przełącz się od 0 bitów do 3 bitów.
Zakładając maskę 32-bitową i 32-bitową int.
int keepBits = 24; /* actually get it from somewhere else? */
int mask = (0xffffffff >> (32 - keepBits)) << (32 - keepBits);
Uwaga: nie jest to koniecznie odpowiedź na pytanie "Jaki jest najlepszy sposób uzyskania maski sieci dla interfejsu?"
Kolejny, który zakłada keepBits> 0. – bk1e
Właściwie ustawiam keepBits na 24, więc jest to z definicji> 0 – tvanfosson
I mniej niż 32 ... – tvanfosson
int keepbits = 24;
int mask = keepbits > 0 ? 0x00 - (1<<(32 - keepbits)) : 0xFFFFFFFF;
Co się stanie, jeśli keepbity == 0? Uważaj, przepełnienia całkowite dostaną ci. – bk1e
Jeśli keepbits ma wartość 0, to "1" przesunie się całkowicie z rejestru (zakładając rejestr 32-bitowy), a maska sieci będzie miała wartość 0. Czy to nie jest właściwa odpowiedź? – Robert
http://en.wikipedia.org/wiki/Bitwise_operation#Shifts_in_C.2C_C.2B.2B_i_Java mówi, że przesunięcie w lewo jest niezdefiniowane, jeśli wystąpi przepełnienie. MSVC i GCC oceniają 1 << 32 jako 1, nie 0. – bk1e
zawsze robię to tak (w przypadku CIDR = 24):
uint32_t ipv4Netmask;
ipv4Netmask = 0xFFFFFFFF;
ipv4Netmask <<= 32 - cidr;
ipv4Netmask = ntohl(ipv4Netmask);
Będzie to działać tylko z ipv4Netmask aby być rzeczywiście uint32_t, nie sprawiają, że int, jako int nie robi w każdym systemie musi być 32-bitowy. Wynik jest konwertowany na kolejność bajtów sieciowych, ponieważ tego oczekuje większość funkcji systemowych.
"wynik jest konwertowany na kolejność bajtów sieciowych" - Myślę, że zamierzałeś wpisać htonl (ipv4Netmask) –
Oto rozwiązanie w 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
Z linii poleceń
>whatmask.vbs 123.12.123.17/23
0xfffff700
co tracić czas z odejmowaniem lub trójskładnikowych stwierdzeniami?
int suffix = 24;
int mask = 0xffffffff^0xffffffff >> suffix;
Jeśli wiesz, że twoja liczba całkowita ma dokładnie 32 bity, musisz tylko raz wpisać 0xffffffff.
int32_t mask = ~(0xffffffff >> suffix);
Obie kompilują się dokładnie z tym samym kodem zestawu.
/* 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);
Należy zachować ostrożność podczas korzystania z poprzednich odpowiedzi z kodem jak:
0xFFFFFFFF << 32 - cidr
lub
-1 << 32 - cidr
W języku C# przynajmniej będzie maskować liczyć przesunięcie z 0x1F pierwszy. Tak więc, dla CIDR z prefiksu 0 (czyli cały zakres adres IPv4):
int cidr=0;
0xFFFFFFFF << (32 - cidr) == 0xFFFFFFFF
który nie jest to, co chcesz. Zamiast tego należy użyć:
int cidr=0;
(int)(0xFFFFFFFFL << (32 - cidr)) == 0
- 1. Jaki jest najlepszy sposób na konwersję z RectF na Rect w systemie Android?
- 2. Jaki jest najbardziej odpowiedni sposób na konwersję nibbles na u64?
- 3. Jaki jest najlepszy sposób na konwersję kolekcji nietypowej na kolekcję ogólną?
- 4. Android Najlepszy sposób na konwersję tablicy bajtów na bitmapę?
- 5. Jaki jest najlepszy sposób na skopiowanie listy?
- 6. Jaki jest najlepszy sposób na seed srand()?
- 7. Jaki jest najlepszy sposób na wdrożenie "timera"?
- 8. Jaki jest najlepszy sposób na naukę Erlanga?
- 9. Jaki jest najlepszy sposób na naukę CUDA?
- 10. Najlepszy sposób na konwersję std :: wstring do QString
- 11. Jaki jest najlepszy sposób na konwersję matrycę SymPy do tablicy numpy/matrycy
- 12. Jaki jest najlepszy sposób na konwersję [[T; 4]; 3] w [T; 12]?
- 13. Jaki jest najprostszy sposób na konwersję zrzutu danych SO z HTML z powrotem na Markdown?
- 14. Jaki jest najlepszy sposób edycji plików .mht (archiwum sieci)?
- 15. Jaki jest najlepszy sposób uwierzytelniania w usłudze sieci Web?
- 16. Jaki jest najlepszy sposób na wykorzystanie motywu jQuery-UI w sieci CDN z lokalną funkcją zastępczą?
- 17. Jaki jest najlepszy sposób na usunięcie wiersza tabeli z jQuery?
- 18. Jaki jest najlepszy sposób na integrację użytkowników ExpressionEngine z MailChimp?
- 19. Jaki jest najlepszy sposób na rozpoczęcie korzystania z NHibernate?
- 20. Jaki jest najlepszy sposób na usunięcie pierwszego elementu z tablicy?
- 21. Jaki jest najlepszy sposób na matematykę z CGFloats w szybkim?
- 22. Jaki jest najlepszy sposób na przeniesienie obrazu za pośrednictwem usługi sieci Web w języku C#?
- 23. Jaki jest najlepszy sposób na obsługę I18N w tabelach odnośników?
- 24. Jaki jest najlepszy sposób na zbudowanie złożonego NSCompoundPredicate?
- 25. Jaki jest najlepszy sposób na eksport dużych katalogów Magento?
- 26. jaki jest najlepszy sposób na parsowanie odpowiedzi xml w AJAX
- 27. Jaki jest najlepszy sposób na usunięcie elementu tablicy w PHP?
- 28. Jaki jest najlepszy sposób na iterowanie kursora Android Cursor?
- 29. Jaki jest najlepszy sposób na analizowanie strony internetowej w Ruby?
- 30. Jaki jest najlepszy sposób na stworzenie prywatnego, autonomicznego środowiska python?
Masz na myśli pro gramatycznie lub na papierze? Nieco więcej szczegółów będzie pomocne. – Brettski
oops. Miałem na myśli programowo.W szczególności jestem zainteresowany robieniem tego w Powershell. Ale ogólnie interesuje się różnymi podejściami. – Choy
dwie części nazywane są prefiksem i sufiksem. – joeforker