C# 将两行代码合并为一行
我需要定义数组的大小,同时保留第一行代码。 当我同时写入它们时,我得到一个错误,因为p数组被定义了两次。我该怎么做 这是整个代码C# 将两行代码合并为一行,c#,arrays,merge,C#,Arrays,Merge,我需要定义数组的大小,同时保留第一行代码。 当我同时写入它们时,我得到一个错误,因为p数组被定义了两次。我该怎么做 这是整个代码 byte[] p = ASCIIEncoding.ASCII.GetBytes(password); byte[] p = new Byte[8] 公共字符串哈希器(字符串密码、字符串id) { 尝试 { 字节[]p=ascienceoding.ASCII.GetBytes(密码); 字节[]a6=ascienceoding.ASCII.GetBytes(id);
byte[] p = ASCIIEncoding.ASCII.GetBytes(password);
byte[] p = new Byte[8]
公共字符串哈希器(字符串密码、字符串id)
{
尝试
{
字节[]p=ascienceoding.ASCII.GetBytes(密码);
字节[]a6=ascienceoding.ASCII.GetBytes(id);
字节向量=0;
对于(int i=0;i<8;i++)
{
totVector=(字节)(totVector+p[i]);
}
字节[]a_concat=新字节[2];
a_concat[0]=(字节)((p[6]*totVector)%256);
a_concat[1]=(字节)((p[7]*totVector)%256);
字节[]a=新字节[8];
对于(int i=0;i<6;i++)
{
a[i]=a6[i];
}
a[6]=a_concat[0];
a[7]=a_concat[1];
字节[]h=新字节[8];
字符串hashedUserPassword=“”;
对于(int i=0;i<8;i++)
{
如果(i==0 | | i==2)h[i]=(字节)((p[i]>2)^a[i]);
否则h[i]=(字节)(p[i]^a[i]);
hashedUserPassword+=h[i].ToString(“X2”);
}
返回hashedUserPassword;
}
抓住
{
返回“错误”;
}
}
当您将字符串编码为ASCII
时,这是有意义的
public string hasher(string password, string id)
{
try
{
byte[] p = ASCIIEncoding.ASCII.GetBytes(password);
byte[] a6 = ASCIIEncoding.ASCII.GetBytes(id);
byte totVector = 0;
for (int i = 0; i < 8; i++)
{
totVector = (byte)(totVector + p[i]);
}
byte[] a_concat = new byte[2];
a_concat[0] = (byte)((p[6] * totVector) % 256);
a_concat[1] = (byte)((p[7] * totVector) % 256);
byte[] a = new byte[8];
for (int i = 0; i < 6; i++)
{
a[i] = a6[i];
}
a[6] = a_concat[0];
a[7] = a_concat[1];
byte[] h = new byte[8];
string hashedUserPassword = "";
for (int i = 0; i < 8; i++)
{
if (i == 0 || i == 2) h[i] = (byte)((p[i] << 1) ^ a[i]);
else if (i == 3 || i == 5) h[i] = (byte)((p[i] >> 2) ^ a[i]);
else h[i] = (byte)(p[i] ^ a[i]);
hashedUserPassword += h[i].ToString("X2");
}
return hashedUserPassword;
}
catch
{
return "error";
}
}
我先问几个问题
密码少于8个字符,您想做什么
byte[] p = ASCIIEncoding.ASCII.GetBytes(
password.Substring(0, password.Length > 8 ? 8 : password.Length));
这将把
密码
截断为8个字符,如果少于8个字符,则在尾垫上加空格。主要问题就在这里:
byte[] p = ASCIIEncoding.ASCII.GetBytes(String.Format("{0,-8}",password));
for(int i=0;i<8;i++)
{
totVector=(字节)(totVector+p[i]);
}
最简单的修复方法是,如果数组没有那么多项,就不要尝试进行8次迭代。因此,首先计算长度:
for (int i = 0; i < 8; i++)
{
totVector = (byte)(totVector + p[i]);
}
int len=Math.Min(p.Length,8);//限制为不超过长度
对于(int i=0;i
我不明白你想做什么。GetBytes
方法创建一个具有适当长度的新数组并返回它。为什么要重新定义它?所以实际上只需要字符串的前8个字符?为什么p被定义了两次?所以要得到一个表示给定字符串的字节数组,然后扔掉它,得到一个新的大小为8的空白字节数组?对我来说似乎毫无意义。所以修改你的循环运行到p.Length
。现在我想听听关于downvote的解释。范妮:)有些人只是想看世界,所有的密码都是8个字符,所以我不希望它被截断。我不明白为什么我得到索引超出范围的错误。@user3698687-你从哪里得到索引超出范围的错误?我运行了它,只要密码是8个字符长,id是6个字符,它就运行了天哪,我在将变量发送到函数时犯了一个愚蠢的错误,它运行得非常完美,非常感谢:)在假设字符串是特定长度之前,您可能应该对变量进行某种验证检查,所以你不会遇到这种问题。
int len = Math.Min(p.Length, 8); // limit to no more than the length
for (int i = 0; i < len; i++)
{
totVector = (byte)(totVector + p[i]);
}