2013-06-06 44 views
1

我剛剛更新了從.net 3.5到4.的內部應用程序,並且我在使用字符串編碼時遇到了一些問題。我有一個我添加到註冊表中的字符串。它被加密(作爲字節數組),然後使用編碼windows-1252轉換爲字符串。在VB.net 3.5和4中的字符串長度差異

當我將其從註冊表中拉出時,我測試了長度。使用VB.net 3.5 .Length給了我23.使用.Net 4我得到了35.Net 4版本更長,但它最後只有多餘的空字符。這會影響解密過程的效果。默認的文字編碼有什麼改變嗎?

.Net4低於。在.NET 3.5的版本出來一樣,但沒有填充0

(0): 13 
(1): 49 
(2): 27 
(3): 42 
(4): 102 
(5): 77 
(6): 178 
(7): 197 
(8): 98 
(9): 198 
(10): 240 
(11): 79 
(12): 171 
(13): 216 
(14): 82 
(15): 55 
(16): 24 
(17): 134 
(18): 117 
(19): 97 
(20): 223 
(21): 69 
(22): 149 
(23): 0 
(24): 0 
(25): 0 
(26): 0 
(27): 0 
(28): 0 
(29): 0 
(30): 0 
(31): 0 
(32): 0 
(33): 0 

編輯:

所以輸入到註冊表有填充。它似乎只是從註冊表中獲得結果不同的字符串。

我使用這個從註冊得到它:

Dim regKey As Microsoft.Win32.RegistryKey 
regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(//Location, False) 
val = poKey.GetValue(name) 

所以我簡單的解決方案將是擺脫填充,當我添加字符串,但任何想法,爲什麼它的不同?

+0

你使用什麼代碼來編碼字符串? – tinstaafl

回答

1

將包含隨機二進制數據的byte []轉換爲Encoding類的字符串是根本錯誤的,這是一種有損轉換。當註冊表嘗試將8位編碼字符串解釋爲有效的utf-16字符串時,可能會加劇此問題。結果將是相當不可預測的。

必須使用能夠處理任意二進制數據的編碼。像Convert.ToBase64String()一樣。

或者,通過將其作爲二進制數據存儲在註冊表中而不是字符串,因此完全不需要轉換。注意需要RegistryValueKind的RegistryKey.SetValue()重載,您對RegistryValueKind.Binary選項感興趣。實際上沒有必要使用該重載,只需直接傳遞byte [],而不要嘗試任何轉換。

+0

是的,同意了。奇怪的是,行爲是不同的。 –