从注册表读取字符串值,但结果包含一些奇怪的字符
Posted
技术标签:
【中文标题】从注册表读取字符串值,但结果包含一些奇怪的字符【英文标题】:Read string value from registry but the result contains some weird characters 【发布时间】:2016-07-04 14:38:34 【问题描述】:我正在使用 Registry.GetValue
从注册表中读取字符串值,我返回的结果似乎有一些从注册表编辑器中看不到的“不可见”字符。
例如,Registry.GetValue
返回"London\0j"
,但我希望它只是"London"
,而在注册表编辑器中我只能看到值"London"
,并且末尾似乎没有任何内容字符串。如果我将此密钥导出到 .reg 文件,它也只会显示 "London"
。我没有写入注册表的权限,因此无法通过导入 .reg 文件进行测试。
将String.Trim
应用到结果也不起作用。
这是什么"\0j"
?
编辑:读取键值的代码
var registryValue =
Registry.GetValue(@"HKEY_LOCAL_MACHINE\SYSTEM\\CurrentControlSet\\Services\\Netlogon\\Parameters",
"DynamicSiteName", String.Empty);
导出的 .reg 文件:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Netlogon\Parameters]
"DynamicSiteName"="London"
【问题讨论】:
你在哪里看到这个“\0j”?在调试器中? 不只是调试器,当我打印出来时,返回的字符串实际上是"London\0J"
..
实际字符“\”、“0”和“j”还是空字符(\0)和字母“j”?
我猜它是 \0 和字母 j 因为字符串的长度是 8
【参考方案1】:
正如您在reference source 中看到的,GetValue
使用RegQueryValueEx
从注册表中读取完整值。
然后根据RegQueryValueEx
返回的注册表类型(作为输出参数)将此数据转换为目标C#类型。
所以您看到的是真正写入注册表的内容。您在 regedit 中看不到 \0j
,因为此工具是使用以零结尾的字符串实现的。所以 regedit “认为” 字符串以 \0
结尾并且不显示它。
但由于GetValue
读取了真正存在的内容,因此您的输出是正确的。 C# 不使用\0
作为字符串终止字符。
当然,我无法告诉您是谁将这些数据写入您的注册表,以及这是否有效。 (它实际上可以被某个应用用作某种奇怪的隐藏信息,以验证该值是由该应用写入的)
【讨论】:
啊..可能是这样。感谢您的详细解释。 @Godsent 我刚刚通过一个小测试进行了验证。将test\0j
(使用binary 0
,而不是\
和0
这两个字符)写入注册表并使用regedit 将其导出。结果相同:\0j
未写入 *.reg 文件,但 c# GetValue
读取它。以上是关于从注册表读取字符串值,但结果包含一些奇怪的字符的主要内容,如果未能解决你的问题,请参考以下文章