当我的脚本运行时,我读取了一个哈希值,我想把它写入注册表。我发现下面的命令可以做到这一点:
New-ItemProperty $RegPath -Name $AttrName -PropertyType Binary -Value $byteArray
我还找到了How to set a binary registry value (REG_BINARY) with PowerShell?。
然而,所有答案都假设字符串的形式为:
"50,33,01,00,00,00,00,00,...."
但我只能读取以下形式的哈希值:
"F5442930B1778ED31A....."
我想不出,我怎么能把它转换成一个字节数组,值为F5,44等。
4条答案
按热度按时间tquggr8v1#
vonPryz明智地建议直接将散列作为 * string *(
REG_SZ
)存储在注册表中。如果您真的希望将数据存储为
REG_BINARY
类型,即存储为一个 * bytes * 数组,则必须在字符串表示之间来回转换。[byte[]]
数组**(使用缩短的示例哈希字符串):-replace '..', '0x$& '
为每对字符添加前缀(十六进制数字)-..
,在替换操作数中引用为$&
-与0x
替换,然后插入一个空格。-split
将生成的字符串拆分为0xHH
字符串数组(H
表示十六进制数字),PowerShell的自动类型转换将其识别为强制转换中[byte[]]
数组的元素。换句话说:上述内容相当于:x1米11米1x
以上是PowerShell默认的结果数组输出表示
[byte[]] (0xF5, 0x44, 0x29)
.[System.Convert]::FromHexString()
和[System.Convert]::ToHexString()
方法获得更简单的解决方案:[byte[]]
数组**转换为 *(转换回字符串):[System.BitConverter]::ToString()
输出用-
* 分隔的两个十六进制数字表示 *,因此要获得所需的表示,必须使用-replace
操作删除所有-
示例:把所有这些放在一起:
cyvaqqii2#
若要解析不具有正则表达式权重的十六进制字符串:
b4qexyjb3#
下面是另一种不使用正则表达式的方法。
}
它可能比你想要的更健壮--它试图支持奇数长度的输入字符串,你可能更喜欢不允许奇数长度的输入字符串,在这种情况下,转换表达式可以被简化。
t40tm48m4#
.Net有一个内置函数。它有点隐藏...
另一个方向是这样的