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

时间:2016-07-04 14:38:34

标签: c# registry

我正在使用Registry.GetValue从Registry读取字符串值,我得到的结果似乎有一些“隐形”字符,我在注册表编辑器中看不到。

例如,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"

1 个答案:

答案 0 :(得分:3)

正如您在reference source GetValue中看到的那样,使用RegQueryValueEx从注册表中读取完整的值。

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

所以你看到的是真正写入注册表的内容。您没有在注册表中看到\0j,因为此工具是使用以零结尾的字符串实现的。所以regedit“认为”字符串以\0结束并且不显示它。

但是,由于GetValue读取确实存在的内容,因此输出是正确的。 C#不使用\0作为字符串终止字符。

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