错误消息:System.ArgumentException:'目标数组不够长,无法复制集合中的所有项目。检查数组索引和长度。'
public static string PassConv(string Password)
{
int iLoop;
int iL;
int iTotal;
int iValue;
string sPassConv;
iL = 3;
iTotal = 0;
for (iLoop = 1; iLoop <= Password.Length; iLoop++) {
string sNo = Password.Substring(iLoop-1,1);
byte[] asciiBytes = Encoding.ASCII.GetBytes(sNo);
iValue = BitConverter.ToInt32(asciiBytes, 0); ---->**Error**
iTotal = iTotal + iValue * (iL + iLoop - 1);
sPassConv = iTotal.ToString();
}
return sPassConv;
}
请帮助谢谢
由于有很多冗余代码,我试图达到您的想法。通过使用:
SubString
导出每个字符,即使Encoding.ASCII.GetBytes
可以从这些字符返回所有字节数组BitConverter
也应为4字节二进制输入https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter.toint32,似乎此功能完全没有帮助sPassConv
多次从iTotal获取价值,应该放在循环之外代码快速修复:
public static string PassConv(string Password)
{
int iLoop;
int iL;
int iTotal;
int iValue;
string sPassConv = "";
iL = 3;
iTotal = 0;
for (iLoop = 1; iLoop <= Password.Length; iLoop++)
{
string sNo = Password.Substring(iLoop - 1, 1);
iValue = Encoding.ASCII.GetBytes(sNo)[0];
iTotal = iTotal + iValue * (iL + iLoop - 1);
sPassConv = iTotal.ToString();
}
return sPassConv;
}
一点重构
public static string PassConv2(string Password, int iL = 3)
{
int iTotal = 0;
var bytes = Encoding.ASCII.GetBytes(Password);
for (var iLoop = 0; iLoop < bytes.Length; iLoop++)
{
// bytes[iLoop] = iValue
iTotal += bytes[iLoop] * (iL + iLoop);
}
return iTotal.ToString();
}
此功能需要改进,因为它确实循环了2次,第一次循环到字节,第二次进行计算。由于每个字符甚至都可以转换为ASCII
,因此我们可以直接将其转换。当输入为Unicode时,例如“Áaa”,Extended ASCII
会给出更准确的信息,PassConv3
用'?'强制转换为“?aa”代表63个ASCII
Encoding.ASCII.GetByteswill
和结果
public static string PassConv3(string Password, int iL = 3)
{
int iTotal = 0;
for (var iLoop = 0; iLoop < Password.Length; iLoop++)
{
iTotal += Password[iLoop] * (iL + iLoop);
}
return iTotal.ToString();
}
希望有帮助!