如何在PowerShell中将哈希字符串转换为字节数组?

时间:2019-02-05 21:09:37

标签: powershell registry

当我的脚本运行时,我读取了一个哈希,我想将其写入注册表。 我发现以下命令可以做到这一点:

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

我还找到了How to set a binary registry value (REG_BINARY) with PowerShell?

但是所有答案都假定该字符串采用以下形式:

"F5442930B1778ED31A....."

但是我只能读取以下形式的哈希值:

{{1}}

我不知道如何将其转换为值F5、44等的字节数组。

3 个答案:

答案 0 :(得分:2)

vonPryz明智地建议将哈希直接存储为注册表中的 string for (int i= 0; i< N_list;i++ ){ k=0; fscanf(fp_in, "%d %d %d", &fixation_number, &x, &y); while (!((x == -1) && (y ==-1))){ Point[k].x = x; Point[k].y =y; Point[k].id_number =k+1; )。

如果您确实想将数据存储为REG_SZ类型,即存储为 bytes 数组,则必须在字符串表示形式之间来回转换。

要将{em>转换为 REG_BINARY数组(使用缩短的示例哈希字符串):

[byte[]]

上面是PowerShell对结果数组
PS> [byte[]] ('F54429' -replace '..', '0x$&,' -split ',' -ne '') 245 # 1st byte: decimal representation of 0xF5 68 # 2nd byte: decimal representation of 0x44 41 # ... 的默认输出表示。


要将{em>从转换为[byte[]] (0xf5, 0x44, 0x29)数组(返回字符串; PSv4 +语法):

[byte[]]

将它们放在一起:

PS> -join ([byte[]] (0xf5, 0x44, 0x29)).ForEach({ '{0:X}' -f $_ })
F54429

答案 1 :(得分:1)

解析一个没有正则表达式权重的十六进制字符串:

# parse the hex string into a BigInt
# leading zeros avoids parsing as negative
$bytes = [bigint]::Parse("00$value",'HexNumber').ToByteArray()

# undo the reversed bytes
[array]::Reverse($bytes)

# drop the leading zero byte
$null,$bytes = $bytes

答案 2 :(得分:0)

这是另一种不使用正则表达式的方法。

function HexToByteArray([string]$hex) {
(0..([Math]::Floor( ($hex.Length+1)/2)-1)).ForEach({[Convert]::ToByte($(if ($hex.Length -ge 2*($_+1)) {$hex.Substring($_*2,2)} else {$hex.Substring($_*2,1).PadRight(2,'0')}),16)})

}

它可能比您想要的更健壮 - 它尝试支持奇数长度的输入字符串。您可能更愿意禁止奇数长度的输入字符串,在这种情况下可以简化转换表达式。