2016-07-09 2 views
2

Так что в основном я пытаюсь получить MAC-адрес из текстового файла и увеличить значение на единицу.Как преобразовать шестнадцатеричную кодированную строку в шестнадцатеричное целое

Пытался головой о стену Google/StackOverflow в течение нескольких часов, думаю, что есть концепция, которую я просто не получаю.

PowerShell:

$Last_MAC_Address = (Get-Content -LiteralPath "\\UNC\Path\Last MAC Address.txt") 

Write-Host ($Last_MAC_Address) 
# Output: 00155DE10B73 

$Next_MAC_Address = (($Last_MAC_Address | Format-Hex) + 1) 
+4

'([Int64] :: Parse ('00155DE10B73', 'HexNumber') + 1). ToString ('X12') ' – PetSerAl

+0

Чувак! Вы легенда, большое вам спасибо – Conan1989

ответ

2

Другим вариантом является префиксом значения с 0x и бросил его в int64:

$Next_MAC_Address = ([int64]"0x$Last_MAC_Address"+1).ToString('X12') 

Вы также может использовать format operator (-f) вместо метода ToString():

$Next_MAC_Address = '{0:X12}' -f ([int64]"0x$Last_MAC_Address"+1) 

Есть, однако, одна вещь, которую стоит отметить. MAC addresses - это не просто случайные 6-байтовые числа без какой-либо внутренней структуры. Они состоят из двух частей. Первые 3 байта образуют Organizationally Unique Identifier (OUI), префикс для конкретного поставщика (00-15-5D является одним из OUI, принадлежащих Microsoft). Только последние 3 байта представляют собой случайное число, уникальный идентификатор для каждой карты у поставщика, идентифицированного OUI.

Принимая это во внимание, вы можете соответствующим образом разделить MAC-адрес, например. как это:

$oui, $nid = $Last_MAC_Address -split '(?<=^[0-9a-f]{6})(?=[0-9a-f]{6}$)' 

или как это:

$oui = $Last_MAC_Address.Substring(0, 6) 
$nid = $Last_MAC_Address.Substring(6, 6) 

и приросте только идентификатор NIC, и только если это будет не переполнение:

if ($nid -ne 'ffffff') { 
    $Next_MAC_Address = "{0}{1:X6}" -f $oui, ([int64]"0x$nid"+1) 
} else { 
    Write-Error 'MAC address overflow.' 
} 
+0

Спасибо за это. Вы совершенно правы. Он находится в списке дел – Conan1989

4

Это процесс 3 шага, и хотя PetSerAl ответил в комментариях, как один лайнер, я сломаю его немного вниз для потомков (и использовать другой класс).

Первый шаг - получить шестнадцатеричное число как десятичное (математическая база 10, а не тип).

Второй шаг - это приращение десятичной дроби.

И последний шаг - преобразование его в шестнадцатеричное.

сломался и не один лайнер это будет выполнить задачу под рукой:

$asDecimal = [System.Convert]::ToInt64("00155DE10B73", 16) 
$asDecimal++ 
$asHex = [System.Convert]::ToString($asDecimal, 16) 
+1

Хороший ответ. Однако 'Convert.ToInt64()' вызывает 'Int64.Parse()' внутренне, аналогично 'Convert.ToString (val)' вызывает 'val.ToString()' внутренне, поэтому технически вы * * используете те же классы, что и в @ Комментарий PetSerAl :-) –

+0

Спасибо, @ MathiasR.Jessen! Я никогда не смотрел на внутренности, и это хорошо знать. –

Смежные вопросы