Как преобразовать хэш-строку в байтовый массив в PowerShell? - PullRequest
0 голосов
/ 06 февраля 2019

Когда запускаются мои скрипты, я читаю хеш и хочу записать его в реестр.Я понял, что следующая команда сделает это:

New-ItemProperty  $RegPath -Name $AttrName -PropertyType Binary -Value $byteArray

Я также нашел Как установить двоичное значение реестра (REG_BINARY) с помощью PowerShell? .

Однако все ответы предполагают, что строка имеет вид:

"50,33,01,00,00,00,00,00,...."

, но я могу прочитать мой хэш только в следующей форме:

"F5442930B1778ED31A....."

Я не могу понять, как можноЯ конвертирую это в байтовый массив со значениями F5, 44 и т. Д.

1 Ответ

0 голосов
/ 06 февраля 2019

vonPryz разумно предлагает просто сохранить хеш непосредственно в виде строки (REG_SZ) в реестре.

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

В конвертировать в a [byte[]] массив (с использованием сокращенной выборочной строки хэша):

PS> [byte[]] -split ('F54429' -replace '..', '0x$& ')
245 # 1st byte: decimal representation of 0xF5
68  # 2nd byte: decimal representation of 0x44
41  # ...

Выше приведено выходное представление PowerShell по умолчанию для результирующего массива
[byte[]] (0xf5, 0x44, 0x29).


преобразовать из a [byte[]] массив (обратно в строку; синтаксис PSv4 +):

PS> -join ([byte[]] (0xf5, 0x44, 0x29)).ForEach('ToString', 'X')
F54429

.ForEach('ToString', 'X') эквивалентно вызову .ToString('X')то есть, запрашивая представление hex - для каждого элемента массива и собирая полученную строку.-join затем соединяет эти строки в одну строку путем прямой конкатенации.


Чтобы сложить все вместе:

# Sample hash string.
$hashString = 'F54429'

# Convert the hash string to a byte array.
$hashByteArray = [byte[]] ($hashString -replace '..', '0x$&,' -split ',' -ne '')

# Create a REG_BINARY registry value from the byte array.
Set-ItemProperty -LiteralPath HKCU:\ -Name tmp -Type Binary -Value $hashByteArray

# Read the byte array back from the registry (PSv5+)
$hashByteArray2 = Get-ItemPropertyValue -LiteralPath HKCU:\ -Name tmp

# Convert it back to a string.
$hashString2 = -join $hashByteArray2.ForEach('ToString', 'X2')

# (Clean up.)
Remove-ItemProperty -LiteralPath HKCU:\ -Name tmp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...