我正在尝试写入多字符串,但使用从REG文件收集的数据,因此它是十六进制格式。我已设法使用Convert-HexStringToByteArray here将字符串转换为字节数组,但这在注册表中不会产生与加载REG相同的结果,所以我认为这实际上并不是正确的数据要转换为的类型。 初始数据看起来像这样
"NavigatorLayoutOrder"=hex(7):31,00,30,00,00,00,31,00,00,00,32,00,00,00,33,00,00,00,30,00,00,00,34,00,00,00,35,00,00,00,36,00,00,00,37,00,00,00,38,00,00,00,39,00,00,00,31,00,31,00,00,00,31,00,32,00,00,00,31,00,33,00,00,00,31,00,34,00,00,00,31,00,35,00,00,00,31,00,36,00,00,00,31,00,37,00,00,00,31,00,38,00,00,00,31,00,39,00,00,00,32,00,30,00,00,00,32,00,31,00,00,00,32,00,32,00,00,00,00,00
我已经删除了十六进制(7):从前面移开,然后尝试将其作为纯字符串并转换为字节数组,似乎都不起作用。 我发现REG_MULTI_SZ的引用是UTF-16le,但我的理解是这也是PowerShell的默认值,所以我不需要改变编码,但也许我错了吗?
编辑:我也尝试了这一点,再次写成功,但错误的结果。
$enc = [system.Text.Encoding]::UTF8
[byte[]]$bytes = $enc.GetBytes($string)
也试过
$array = $string.Split(',')
$byte = [byte[]]$array
这也将数据放入注册表,但结果与导入REG不同。并且,我发现的一切都指向REG文件是UTF16的想法,所以我尝试了
$enc = [system.Text.Encoding]::Unicode
[byte[]]$bytes = $enc.GetBytes($string)
BigEndianUnicode& Unicode格式。它不仅不起作用,结果与我发现奇怪的相同。似乎更改字节序应该改变结果。
编辑:为了澄清,从REG文件中获取的输入字符串如上所示。我只是从数据的前面删除了 hex(7):。
这里可以看到结果,其中第二个值是PowerShell的结果,而第一个值是REG文件生成的结果。
用于产生此代码的代码是
$string = "31,00,30,00,00,00,31,00,00,00,32,00,00,00,33,00,00,00,30,00,00,00,34,00,00,00,35,00,00,00,36,00,00,00,37,00,00,00,38,00,00,00,39,00,00,00,31,00,31,00,00,00,31,00,32,00,00,00,31,00,33,00,00,00,31,00,34,00,00,00,31,00,35,00,00,00,31,00,36,00,00,00,31,00,37,00,00,00,31,00,38,00,00,00,31,00,39,00,00,00,32,00,30,00,00,00,32,00,31,00,00,00,32,00,32,00,00,00,00,00"
$enc = [system.Text.Encoding]::BigEndianUnicode
[byte[]]$bytes = $enc.GetBytes($string)
New-ItemProperty "HKCU:\Software\Synchro\Synchro\ProjectConfig" -name:"NavigatorLayoutOrder2" -value:$bytes -propertyType:MultiString -force
答案 0 :(得分:1)
首先,多字符串是小端编码的,因此您需要[Text.Encoding]::Unicode
,而不是[Text.Encoding]::BigEndianUnicode
。另外,在.reg文件([Text.Encoding]::Unicode.GetBytes()
)的字符串上使用"31,00,30,00,..."
将为您提供该字符串的字符的字节数组:
'3'
→51,0 '1'
→49,0 ','
→44,'0'
→48,您真正想要的是该字符串中以逗号分隔的十六进制值的字节数组:
31
→49(字符'1'
)00
→0(字符NUL
)30
→48(字符'0'
)以逗号分割字符串,将十六进制数字字符串转换为整数,并将得到的整数列表转换为字节数组:
[byte[]]$bytes = $string -split ',' | ForEach-Object { [int]"0x$_" }
然后您可以将该(小端编码)字节数组转换为字符串:
$ms = [Text.Encoding]::Unicode.GetString($bytes)
并将其写入注册表:
$key = 'HKCU:\Software\Synchro\Synchro\ProjectConfig'
$name = 'NavigatorLayoutOrder2'
New-ItemProperty $key -Name $name -Value $ms -PropertyType MultiString -Force