Есть ли способ перевернуть биты в маске su bnet, чтобы получить маску подстановки, используя PowerShell? - PullRequest
0 голосов
/ 28 февраля 2020

Поэтому я пытаюсь создать свой собственный сетевой калькулятор с помощью PowerShell и наткнулся на загадку с маской. Я застрял, пытаясь получить маску подстановки, используя маску su bnet. Например, в настоящее время я тестирую с использованием маски / 24 - 255.255.255.0 и преобразовал ее в двоичное значение - 11111111.11111111.11111111.00000000. Значение, которое я получаю от выполнения -bnot, я ожидал бы равным 00000000.00000000.00000000.11111111, но вместо этого я получаю -256.-256.-256.-1. Я пытался go бит за маской без '.' и вместо этого я заканчиваю с -2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2 -2-2-1-1-1-1-1-1-1-1.

Ниже приведен код, который я использовал, чтобы связываться с макетом двоичного файла маски su bnet, чтобы работать с ним, и l oop, который я пытался использовать для выполнения побитового НЕ операция:

<code><pre>
$subbinarray = $subbin.ToCharArray() # Places 1 bit per row
$broadbin = ''
for ($x = 0; $x -lt 32; $x++) { # Loops through the subbinarray and performs -bnot function on each row
    $bit = -bnot [Convert]::ToUInt32($subbinarray[$x],2)
    $broadbin += $bit
}

1 Ответ

0 голосов
/ 28 февраля 2020

Без сомнения, есть более элегантные способы сделать это, но вы можете перевернуть двоичные значения следующим образом:

 '11111111.11111111.11111111.00000000'.Replace("1", "x").Replace("0", "1").Replace("x", "0") 

Результат:

00000000.00000000.00000000.11111111

Другой способ выполняя это:

$ip = '255.255.255.0'
$mask = ($ip -split '\.' | ForEach-Object {255 - [byte]$_} ) -join '.'


Еще один способ - преобразовать строку адреса IP4 в ее десятичное значение unsigned , использовать -bnot для этого значения и преобразовать обратно в IP-адрес .
$ip = '255.255.255.0'

# convert to UInt32
# This is now obsolete:  $ipValue = [uint32] ([System.Net.IPAddress]$ip).Address
# so we do it like this:
$a = [uint32[]]$ip.split('.')
$ipValue = [uint32]($a[3] -shl 24) + ($a[2] -shl 16) + ($a[1] -shl 8) + $a[0]

# use -bnot and convert back to IP address string:
$mask = [System.BitConverter]::GetBytes(-bnot $ipValue) -join '.'
# or use: $mask = [string]([System.Net.IPAddress](-bnot $ipValue)).IPAddressToString

$mask

Результат:

$ip   --> '255.255.255.0'  --> 11111111.11111111.11111111.00000000
$mask --> '0.0.0.255'      --> 00000000.00000000.00000000.11111111
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...