将两行代码合并为一行

时间:2014-06-02 17:41:56

标签: c# arrays merge

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";
        }


    }

3 个答案:

答案 0 :(得分:2)

主要问题就在这里:

        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]);
}

答案 1 :(得分:0)

当您将字符串编码为ASCII时,这是有道理的。

byte[] p = ASCIIEncoding.ASCII.GetBytes(
            password.Substring(0, password.Length > 8 ? 8 : password.Length));

答案 2 :(得分:0)

我将从几个问题开始......

  1. 你想要&#39;密码&#39;如果超过8个字符,则截断为8个字符?
  2. 如果password,您想做什么? 8个字符?
  3. 你可以这样做:

    byte[] p = ASCIIEncoding.ASCII.GetBytes(String.Format("{0,-8}",password));
    

    如果小于8个字符,则会将password截断为8个字符,并使用空格填充尾垫。