vonPryz明智地建议直接将哈希值作为字符串 (REG_SZ
) 存储在注册表中。
如果您真的想将数据存储为 REG_BINARY
类型,即作为一个字节数组,您需要在字符串表示和字节数组之间进行转换。
要 将其转换为 [byte[]]
数组(使用缩短的样本哈希字符串):
PS> [byte[]] -split ('F54429' -replace '..', '0x$& ')
245
68
41
-replace '..', '0x$& '
将每一对字符(16进制数)..
前缀加上0x
,并在后面插入一个空格。 -split
把结果字符串分割成0xHH
字符串的数组(H
代表一个16进制数),PowerShell的自动类型转换将其识别为强制转换成[byte[]]
数组的元素。换句话说:以上是等同于下面的代码:
[byte[]] ('0xF5', '0x44', '0x29')
以上是PowerShell输出的默认结果,表示一个 [byte[]] (0xF5, 0x44, 0x29)
数组。
更新:在 PowerShell (Core) 7.1+ / .NET 5+ 中,通过新的 [System.Convert]::FromHexString()
和 [System.Convert]::ToHexString()
方法,现在提供了一个更简单的解决方案:
[System.Convert]::FromHexString('F54429')
[System.Convert]::ToHexString([byte[]] (0xF5, 0x44, 0x29))
要将一个[byte[]]
数组转换为字符串,可以使用[System.BitConverter]::ToString()
方法进行转换。该方法返回由两个十六进制数表示的字符串,这些数字用-
分隔。为得到所需的表示形式,需要使用-replace
操作删除所有的-
符号。
[System.BitConverter]::ToString([byte[]] (0xf5, 0x44, 0x29)) -replace '-'
总结起来:
$hashString = 'F54429'
$hashByteArray = [byte[]] -split ($hashString -replace '..', '0x$& ')
Set-ItemProperty -LiteralPath HKCU:\ -Name tmp -Type Binary -Value $hashByteArray
$hashByteArray2 = Get-ItemPropertyValue -LiteralPath HKCU:\ -Name tmp
$hashString2 = [System.BitConverter]::ToString($hashByteArray2) -replace '-'
Remove-ItemProperty -LiteralPath HKCU:\ -Name tmp