سلام به دوستان عزیز ITPro ای و علاقه مندان به برنامه نویسی و توسعه نرم افزار. در این آموزش می خواهیم برنامه ای را پیاده سازی نماییم که با استفاده از الگوریتم هش SHA1 پیاده سازی شده در دات نت و استفاده از BackGroundWorker و ProgressBar از فایل هایمان کد هش SHA1 تولید نماییم.
مجموعه دوره آموزش برنامه نویسی - مقدماتی تا پیشرفته
فضای نام های مورد نیاز (Namespace)
using System.IO;
using System.Security.Cryptography;
کد دکمه OpenFile برای انتخاب فایل مورد نظرمان جهت محاسبه کد هش آن
private void btnOpenFile_Click(object sender, EventArgs e)
{
using (OpenFileDialog ofd=new OpenFileDialog())
{
if (ofd.ShowDialog()==DialogResult.OK)
{
txtPath.Text = ofd.FileName;
}
}
}
کد دکمه ComputeHash برای فراخونی BackGroundWorker جهت محاسبه کد هش
private void btnComputeHash_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync(txtPath.Text);
}
کد BackGroundWorker جهت محاسبه کد هش فایل موردنظر و گزارش درصد پیشرفت به ProgressBar
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string path = e.Argument.ToString();
byte[] buffer;
int bytesRead;
long size;
long totalBytesRead = 0;
using (Stream InputFile = File.OpenRead(path))
{
size = InputFile.Length;
using (HashAlgorithm hasher = HashAlgorithm.Create("SHA1"))
{
do
{
buffer = new byte[4096];
bytesRead = InputFile.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 = ConvertByteToString(hasher.Hash);
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show(e.Result.ToString(), "SHA1");
progressBar1.Value = 0;
txtPath.Text = string.Empty;
}
کد تابع ConvertByteToString برای تبدیل آرایه ای از بایت ها به رشته
private string ConvertByteToString(byte[] buffer)
{
StringBuilder sb = new StringBuilder(buffer.Length);
foreach (byte item in buffer)
{
sb.Append(item.ToString("X2"));
}
return sb.ToString();
}