当我的脚本运行时,我读取了一个哈希,我想将其写入注册表。 我发现以下命令可以做到这一点:
"50,33,01,00,00,00,00,00,...."
我还找到了How to set a binary registry value (REG_BINARY) with PowerShell?。
但是所有答案都假定该字符串采用以下形式:
"F5442930B1778ED31A....."
但是我只能读取以下形式的哈希值:
{{1}}
我不知道如何将其转换为值F5、44等的字节数组。
答案 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)})
}
它可能比您想要的更健壮 - 它尝试支持奇数长度的输入字符串。您可能更愿意禁止奇数长度的输入字符串,在这种情况下可以简化转换表达式。