VB.net 3.5和4中的字符串长度差异

VB.net 3.5和4中的字符串长度差异,.net,vb.net,string,character-encoding,.net,Vb.net,String,Character Encoding,我刚刚将一个内部应用程序从.NET3.5升级到了4。我在字符串编码方面遇到了一些问题。我有一个字符串要添加到注册表中。它被加密(作为字节数组),然后使用编码windows-1252转换为字符串 当我把它从注册表中取出时,我测试长度。使用VB.NET3.5。Length给我23。使用.NET4我得到35。.NET4版本更长,但它只是在末尾有额外的空字符。这对解密过程的工作方式产生了影响。默认文本编码有什么变化吗 .Net4在下面。.NET3.5版本也一样,但没有0的填充 (0): 13 (1):

我刚刚将一个内部应用程序从.NET3.5升级到了4。我在字符串编码方面遇到了一些问题。我有一个字符串要添加到注册表中。它被加密(作为字节数组),然后使用编码windows-1252转换为字符串

当我把它从注册表中取出时,我测试长度。使用VB.NET3.5
。Length
给我23。使用.NET4我得到35。.NET4版本更长,但它只是在末尾有额外的空字符。这对解密过程的工作方式产生了影响。默认文本编码有什么变化吗

.Net4在下面。.NET3.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)

因此,我最简单的解决方案是在添加字符串时去掉填充,但有没有想过为什么它会不同?

使用编码类将包含随机二进制数据的字节[]转换为字符串从根本上是错误的,这是一种有损转换。注册表试图将8位编码的字符串解释为有效的utf-16字符串,这可能会加剧这种情况。结果将相当不可预测

您必须使用能够处理任意二进制数据的编码。例如Convert.ToBase64String()


或者,更有效地将其作为二进制数据存储在注册表中,而不是字符串,这样就不需要进行任何转换。注意RegistryKey.SetValue()重载需要一个,您对RegistryValueKind.Binary选项感兴趣。实际上不需要使用该重载,只需直接传递字节[],并且根本不尝试任何转换。

使用编码类将包含随机二进制数据的字节[]转换为字符串从根本上是错误的,这是一种有损转换。注册表试图将8位编码的字符串解释为有效的utf-16字符串,这可能会加剧这种情况。结果将相当不可预测

您必须使用能够处理任意二进制数据的编码。例如Convert.ToBase64String()


或者,更有效地将其作为二进制数据存储在注册表中,而不是字符串,这样就不需要进行任何转换。注意RegistryKey.SetValue()重载需要一个,您对RegistryValueKind.Binary选项感兴趣。实际上不需要使用该重载,只需直接传递字节[],根本不尝试任何转换。

您使用什么代码编码字符串?您使用什么代码编码字符串?是的,同意。奇怪的是,行为不同。是的,同意。奇怪的是,这种行为是不同的。