【问题标题】:String length difference in VB.net 3.5 and 4VB.net 3.5 和 4 中的字符串长度差异
【发布时间】:2013-06-06 03:50:16
【问题描述】:

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

当我将它从注册表中拉出时,我会测试长度。使用 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

编辑:

所以注册表的输入有填充。看起来从注册表中获取它会导致不同的字符串。

我正在使用它从 Reg 中获取它:

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

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

【问题讨论】:

  • 你用什么代码来编码字符串?

标签: .net vb.net string character-encoding


【解决方案1】:

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

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

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

【讨论】:

  • 是的,同意。奇怪的是行为不同。
猜你喜欢
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多