将两行代码合并为一行
本文关键字:一行 合并 两行 代码 | 更新日期: 2023-09-27 18:06:12
byte[] p = ASCIIEncoding.ASCII.GetBytes(password);
byte[] p = new Byte[8]
我需要定义数组的大小,同时保留第一行代码。当我把它们都写出来的时候,我得到了一个错误,因为p数组被定义了两次。我该怎么做呢?
这是整个代码
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";
}
}
主要问题就在这里:
for (int i = 0; i < 8; i++)
{
totVector = (byte)(totVector + p[i]);
}
最简单的修复方法是,如果数组没有那么多元素,就不要尝试进行8次迭代。所以先计算长度:
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]);
}
当您将字符串编码为ASCII
时,这是有意义的。
byte[] p = ASCIIEncoding.ASCII.GetBytes(
password.Substring(0, password.Length > 8 ? 8 : password.Length));
我将从几个问题开始…
- 如果密码超过8个字符,您是否希望将"密码"截断为8个字符?
- 如果
password
是<8个字符?
你可以这样做:
byte[] p = ASCIIEncoding.ASCII.GetBytes(String.Format("{0,-8}",password));
这将截断password
为8个字符,如果小于8个字符,则尾垫为空格。