2016-07-04 30 views
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" 
+0

你在哪裏看到這個「\ 0j」?在調試器中? – Jure

+0

不僅僅是調試器,當我打印出來時,返回的字符串實際上是「London \ 0J」' – Godsent

+0

實際字符「\」,「0」和「j」或空字符(\ 0)和字母「J」? – Jure

回答

3

正如你可以看到reference sourceGetValue使用RegQueryValueEx從註冊表中讀取完整的價值。

然後根據返回的返回的註冊表類型(作爲輸出參數),將此數據轉換爲目標C#類型。

因此,您看到的是真正寫入註冊表的內容。您沒有看到\0j在註冊表中,因爲此工具是使用零終止的字符串實現的。所以regedit「認爲」字符串在\0處結束,並且不顯示它。

但是由於GetValue讀取了什麼真的有,您輸出的是正確的。 C#不使用\0作爲字符串終止字符。

當然,我不能告訴你是誰寫這些數據到你的註冊表,如果這是有效的或不。 (它實際上可以用作應用程序的某種奇怪的隱藏信息,以驗證該值是否由此應用程序編寫)

+0

啊..可能就是這樣。感謝您的詳細解釋。 – Godsent

+0

@Godsent我剛剛通過一些測試進行了驗證。將'test \ 0j'(使用_binary_'0',而不是兩個字符'\'和'0')寫入註冊表並使用regedit導出。相同的結果:'\ 0j'不是寫入* .reg文件,而是c#'GetValue'讀取它。 –

+0

謝謝!另一個神祕解決:) – Godsent

相關問題