我正在调试在服务器上运行的应用程序,用户将在另一台服务器上访问该应用程序。该应用程序使用加密,作为密钥的一部分,我正在使用String.Reverse
属性。
Dim Mystring As String = "123abc"
Dim reverse = String.Format("{0},{1}", Mystring.Reverse)
当我从一台计算机(RDP/Citrix 环境 ASP.NET 4.6.1)运行时,字符串reverse
是不同的。值为:
System.Linq.Enumerable+<ReverseIterator>d__a2`1[System.Char]
相同的字符串,但从另一台计算机运行(RPD 非 Citrix 环境 ASP.NET 4.5.2)。reverse
的值为:
System.Linq.Enumerable+<ReverseIterator>d__73`1[System.Char]
为什么不同环境中的值不同?
先看这一行:
Dim reverse = String.Format("{0},{1}", Mystring.Reverse)
具体来说,这个表达式:
Mystring.Reverse
Reverse
是一个函数,而不是一个属性,但它缺少括号()
。这里的诀窍是String.Format()
方法接受基Object
类型作为参数,编译器能够将MyString.Reverse
表达式视为可转换为对象的委托类型。在输出中看到的值是对该函数委托调用.ToString()
的结果。它是函数的类型名称,与MyString
对象的值无关。由于该类型是在运行时动态随机生成的,因此您不仅会在不同的平台上看到不同的值,而且在同一台计算机上看到不同的运行。
在 VB6 时代,调用不带括号的方法是正常的。在 .Net 世界中,调用方法时始终使用括号。
你想要的是这个:
Dim reverse As String = String.Format("{0},{1}", Mystring.Reverse())
即使在这里,您也缺少与格式字符串匹配的第二个参数。我怀疑你会得到你期望的结果。
最后,在加密方面,将字符串反转为密钥似乎非常错误。您正在使用System.Security.Cryptography
库中的真实 cyrptogrpahic 算法,对吧?右!?
您输出的不是反转String
的值,而是用于执行反转的类型的名称。 该类型是动态创建和随机命名的。 这两个名称中的"d"表示"动态","a2"和"73"部分是随机的。
基本上,你认为是一个问题不是问题。 问题是您实际上并没有从反向输出创建String
。 你说"String.Reverse
财产,但那不是财产。 它是一个方法,它不是String
类的成员,而是IEnumerable(Of T)
接口上的扩展方法。 您将String
视为Char
值的可枚举列表并反转。 如果你想要一个String
,那么你需要创建一个,即
MyReversedString = New String(Mystring.Reverse().ToArray())
这会将迭代器的内容推送到数组中,然后从该数组创建新的String
对象。