【问题标题】:Merging two lines of code into one [closed]将两行代码合并为一行[关闭]
【发布时间】:2014-07-22 21:51:32
【问题描述】:
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";
        }


    }

【问题讨论】:

  • 我不明白你在做什么。 GetBytes 方法创建一个适当长度的新数组并返回它。为什么要重新定义它?
  • 所以你实际上只想要字符串的前 8 个字符?
  • 为什么p被定义了两次?
  • 所以你想得到一个表示给定字符串的字节数组,然后把它扔掉,得到一个大小为 8 的新空白字节数组?对我来说似乎毫无意义。
  • 所以修改你的循环运行到p.Length

标签: c# arrays merge


【解决方案1】:

主要问题就在这里:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 现在我想听听关于downvote 的解释。会很漂亮:)
    • 有些人只想看世界燃烧
    【解决方案3】:

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

    1. 如果“密码”超过 8 个字符,是否要将其截断为 8 个字符?
    2. 如果password

    你可以这样做:

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

    这会将password 截断为 8 个字符,如果少于 8 个字符,则尾部用空格填充。

    【讨论】:

    • 所有密码都是 8 个字符,所以我不希望它被截断。我不明白为什么我的索引超出范围错误。
    • @user3698687 - 你从哪里得到索引超出范围错误?我跑了,只要密码是8个字符,id是6个字符,它就会运行
    • 天哪,我在将变量发送到函数时犯了一个愚蠢的错误,非常感谢它运行完美:)
    • 在假设字符串具有特定长度之前,您可能应该对变量进行某种验证检查,这样您就不会遇到这类问题。
    猜你喜欢
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多