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

本文关键字:包含一 字符 结果 读取 注册表 字符串 | 更新日期: 2023-09-27 17:54:48

我正在使用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"

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

您可以在参考源代码中看到,GetValue使用RegQueryValueEx从注册表中读取完整的值。

然后根据RegQueryValueEx返回的注册表类型(作为输出参数)将此数据转换为目标c#类型。

所以你看到的是真正写入注册表的内容。在regedit中看不到'0j,因为这个工具是使用零终止字符串实现的。因此,regedit"认为"字符串在'0处结束,而不显示它。

但是由于GetValue读取真正存在的内容,您的输出是正确的。c#不使用'0作为字符串终止字符。

当然,我不能告诉你是谁把这些数据写进了你的注册表,也不能告诉你这是否有效。(它实际上可以被应用程序用作某种奇怪的隐藏信息,以验证该值是由该应用程序编写的)