正在尝试将代码从VB转换为c#,请参阅下面的VB代码
Dim StrCount As Int16
Dim str1, str2, EncryptedStr As String
EncryptedStr = String.Empty
theString = "Test@1234"
For StrCount = 1 To Len(theString)
str1 = Asc(Mid(theString, StrCount, 1)) - 1
str2 = str1 + Asc(Mid(StrCount, 1))
EncryptedStr = EncryptedStr + Chr(str2)
Next
转换成c#代码
string EncryptedStr = string.Empty;
Encoding encode1 = Encoding.ASCII;
Byte[] encodedBytes = encode1.GetBytes("Test@1234");
for (int count = 0; count < encodedBytes.Length; count++)
{
int str1 = encodedBytes[count] - 1;
Encoding encode2 = Encoding.ASCII;
Byte[] encodedBytes1 = encode2.GetBytes((count + 1).ToString());
int str2 = str1 + (int)encodedBytes1[0];
EncryptedStr += Convert.ToChar(str2);
}
它的工作很好,但我面临的问题是加密的密码是不同的VB &c#
我尝试加密字符串"Test@1234",加密的结果是
VB:"——¥§tfhjl
c#:¥§tfhjl
我调试并注意到在c#中Convert.ToChar(132) &Convert.ToChar(150)返回空值。
谁能解释一下这里出了什么问题
正如在此回答的评论中解释的那样,VB。NET返回当前windows代码页中的ANSI代码,而不是ASCII代码。不要期望得到相同的输出,除非您使用相同的函数,参考Microsoft.VisualBasic
并使用Strings.Asc
和Strings.Chr
来获得相同的结果。
与原始代码相同的最简单的解决方案是在VisualBasic
名称空间中使用Asc
和Chr
方法,因为它们具有相同的功能。
,
Asc使用的ANSI可以在不同的语言环境和不同的机器上改变,所以如果你真的想要固执,你可以尝试通过显式定义要使用的编码来模仿它。
这在我的机器上产生相同的结果(但要小心在其他机器上测试):
Public Function EncryptString(aString As String) As String
Dim sb As New StringBuilder
Dim enc = Encoding.GetEncoding("windows-1252")
For i = 0 To aString.Length - 1
Dim x = enc.GetBytes(aString.Substring(i, 1))(0) - 1
Dim y = enc.GetBytes((i + 1).ToString)(0) + x
Dim b() As Byte = {y}
sb.Append(enc.GetString(b))
Next
Return sb.ToString
End Function
所以(未经测试的)c#等效是:
public string EncryptString(string aString)
{
StringBuilder sb = new StringBuilder();
var enc = Encoding.GetEncoding("windows-1252");
for (var i = 0; i < aString.Length; i++)
{
var x = enc.GetBytes(aString.Substring(i, 1))[0] - 1;
var y = enc.GetBytes((i + 1).ToString())[0] + x;
byte[] b = {y};
sb.Append(enc.GetString(b));
}
return sb.ToString();
}
Vb.net遗留Asc函数,实际上是使用System.Text.Encoding.Default。在c#版本中,您使用的是ASCII。检查:
string EncryptedStr = string.Empty;
Encoding encode1 = Encoding.Default; //.ASCII;
Byte[] encodedBytes = encode1.GetBytes("Test@1234");
for (int count = 0; count < encodedBytes.Length; count++)
{
int str1 = encodedBytes[count] - 1;
Encoding encode2 = Encoding.Default;
Byte[] encodedBytes1 = encode2.GetBytes((count + 1).ToString());
int str2 = str1 + (int)encodedBytes1[0];
EncryptedStr += Convert.ToChar(str2);
}