Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从注册表读取字符串值,但结果包含一些奇怪的字符_C#_Registry - Fatal编程技术网

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

C# 从注册表读取字符串值,但结果包含一些奇怪的字符,c#,registry,C#,Registry,我正在使用Registry.GetValue从注册表读取字符串值,返回的结果似乎有一些“不可见”字符,而我在注册表编辑器中看不到这些字符 例如,Registry.GetValue返回“London\0j”,但我希望它只是“London”,在注册表编辑器中,我只能看到值“London”,而且字符串末尾似乎没有任何内容。如果我将此密钥导出到.reg文件,它也只显示“London”。我没有写入注册表的权限,因此无法通过导入.reg文件进行测试 对结果应用String.Trim也不起作用 这是什么“\0

我正在使用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
作为字符串终止字符

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

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

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

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

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


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

您在哪里看到此“\0j”?在调试器中?不仅仅是调试器,当我打印它时,返回的字符串实际上是
“London\0J”
。实际的字符“\”、“0”和“j”或空字符(\0)和字母“j”?我猜是\0和字母j,因为字符串的长度是8。您在哪里看到这个“\0J”?在调试器中?不仅是调试器,当我打印它时,返回的字符串实际上是
“London\0J”
。实际字符“\”、“0”和“j”或空字符(\0)和字母“j”?我猜是\0和字母j,因为字符串的长度是8Ah。可能是这样。谢谢你的详细解释。@godssent我刚刚通过一个小测试进行了验证。将
test\0j
(使用二进制
0
,而不是两个字符
\
0
)写入注册表并使用regedit导出。相同的结果:
\0j
不会写入*.reg文件,但c#
GetValue
会读取它。啊..可能就是这样。谢谢你的详细解释。@godssent我刚刚通过一个小测试进行了验证。将
test\0j
(使用二进制
0
,而不是两个字符
\
0
)写入注册表并使用regedit导出。相同的结果:
\0j
不会写入*.reg文件,但c#
GetValue
会读取它。