从注册表读取字符串值,但结果包含一些奇怪的字符

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 读取它。

以上是关于从注册表读取字符串值,但结果包含一些奇怪的字符的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 读写注册表

从注册表中读取值

C++读取注册表时使用服务失败但在控制台中同样成功

Linux字符设备驱动注册流程

CoreData 错误存储包含 ä、ö、ü、ß 的字符串

Win.ini和注册表的读取写入