簡體   English   中英

VB.net 3.5和4中的字符串長度差異

[英]String length difference in VB.net 3.5 and 4

我剛剛將內部應用程序從.Net 3.5更新到了4。我在字符串編碼方面遇到了一些問題。 我有一個字符串要添加到注冊表中。 它被加密(作為字節數組),然后使用Windows-1252編碼轉換為字符串。

當我將其拉出注冊表時,我會測試長度。 使用VB.net 3.5 .Length給了我23.使用.Net 4,我得到了35。.Net4版本更長,但最后只是多余的空字符。 這會影響解密過程的工作方式。 默認文本編碼是否有所改變?

.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

編輯:

因此,注冊表中的輸入具有填充。 似乎從注冊表中獲取它會導致不同的字符串。

我正在使用它從Reg中獲取它:

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

因此,我最簡單的解決方案是在添加字符串時擺脫填充,但是否有其他想法呢?

使用Encoding類將包含隨機二進制數據的byte []轉換為字符串是根本錯誤的,這是有損轉換。 然后,讓注冊表嘗試將8位編碼的字符串解釋為有效的utf-16字符串,可能會加劇這種情況。 結果將是不可預測的。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM