Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将两行代码合并为一行_C#_Arrays_Merge - Fatal编程技术网

C# 将两行代码合并为一行

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

我需要定义数组的大小,同时保留第一行代码。 当我同时写入它们时,我得到一个错误,因为p数组被定义了两次。我该怎么做

这是整个代码

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个字符,是否将其截断为8个字符
  • 如果
    密码
    少于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]);
    }