尝试将代码从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&amp; C#
我尝试加密字符串“Test @ 1234”,加密结果是
VB:“ - ¥§tfhjl
C#:¥§tfhjl
我调试并注意到在C#Convert.ToChar(132)&amp; Convert.ToChar(150)给出空值。
有人可以解释,这里出了什么问题
答案 0 :(得分:1)
最简单的解决方案和与原始代码完全相同的解决方案是使用Asc
命名空间中的Chr
和VisualBasic
方法,因为它们具有相同的功能。
但是
Asc使用的ANSI可以在不同的语言环境和不同的机器上进行更改,因此如果你真的想要顽固,你可以通过明确定义要使用的编码来尝试模拟它。
这会在 my 计算机上产生相同的结果(但要小心在其他计算机上测试):
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();
}
答案 1 :(得分:1)
正如在这个答案here的评论中所解释的那样,VB.NET在当前的Windows代码页中返回ANSI代码,而不是ASCII代码。除非您使用相同的功能,参考Microsoft.VisualBasic
并使用Strings.Asc
和Strings.Chr
来获得相同的结果,否则不要期望获得相同的输出。
答案 2 :(得分:0)
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);
}