【问题标题】:File hash algorithm code c#文件哈希算法代码c#
【发布时间】:2018-07-14 15:43:22
【问题描述】:

我的应用程序的一部分有望能够对用户指定的文件进行哈希处理,但我被困在实际代码本身上。请注意:

filepath512(.text) = 用户插入文件路径的文本框

fileout(.text) = 输出文本框

button21_click = "Hash/confirm" 按钮用于启动散列算法

当我运行应用程序并运行哈希算法时,什么也没有发生(结果没有出现在输出文本框中)。 几周前,我实际上用相同的代码(好吧,相同的结构)成功地执行了散列算法,并且运行得非常好! 我刚刚开始使用 C#,所以请原谅任何混乱的代码!

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        string filePath = e.Argument.ToString();

        byte[] buffer;
        int bytesRead;
        long size;
        long totalBytesRead = 0;

        using (Stream file = File.OpenRead(filePath))
        {
            size = file.Length;

            using (HashAlgorithm hasher = SHA512.Create())
            {
                do
                {
                    buffer = new byte[4096];

                    bytesRead = file.Read(buffer, 0, buffer.Length);

                    totalBytesRead += bytesRead;

                    hasher.TransformBlock(buffer, 0, bytesRead, null, 0);

                    backgroundWorker1.ReportProgress((int)((double)totalBytesRead / size * 100));
                }
                while (bytesRead != 0);

                hasher.TransformFinalBlock(buffer, 0, 0);

                e.Result = MakeHashString(hasher.Hash);
            }
        }

    }

    private static string MakeHashString(byte[] hashbytes)
    {
        StringBuilder hash = new StringBuilder(32);

        foreach (byte b in hashbytes)
            hash.Append(b.ToString("X2").ToLower());

        return hash.ToString();
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar3.Value = e.ProgressPercentage;
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        fileout512.Text = e.Result.ToString();
        progressBar3.Value = 0;
    }

    private void button21_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync(filepath512.Text);
    }

【问题讨论】:

  • 你应该为你的控件命名。

标签: c# algorithm hash cryptography


【解决方案1】:

实际上,您的代码错过了很多健全性检查。首先,您应该使用OpenFileDialog 而不是直接用户输入来指定路径。其次,一旦进程开始,您应该使用File.Exists 方法确保文件存在...如果不存在,您应该返回适​​当的结果。

很可能,您的代码在某处引发了异常。来自官方MSDN documentation

如果操作成功完成并且其结果分配在 DoWork 事件处理程序,您可以通过 RunWorkerCompletedEventArgs.Result 属性。

[...]

您的 RunWorkerCompleted 事件处理程序应始终检查错误 和 Canceled 属性,然后再访问 Result 属性。如果 引发异常或如果操作被取消,则访问 Result 属性引发异常。

因此,请使用事件参数的Error 属性检查错误详细信息,以确保您的代码正确执行而没有异常。如果是这种情况,您必须修复代码以使哈希不再失败。

【讨论】:

    【解决方案2】:

    文件是否存在?在尝试执行操作之前,您必须始终检查文件是否存在。调试文件路径,看是否存在,是否有读权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 2016-06-23
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2012-05-24
      • 2011-10-24
      相关资源
      最近更新 更多