So Sánh Nội Dung 2 Tập Tin Sử Dụng Thư Viện Của Microsoft Visual Studio - C#

Cập nhật ngày: 25/01/2022 - Đã có 674 lượt xem bài viết này!
So Sánh Nội Dung 2 Tập Tin Sử Dụng Thư Viện Của Microsoft Visual Studio - C#
So sánh nội dung giữa 2 tập tin sử dụng thư viện System.Text và System.Security.Cryptography, môi trường C# Microsoft Visual Studio, lợi ích trong việc hạn chế khả năng sao chép, bảo vệ sở hữu trí tuệ. Trong quá trình làm việc với dự án mở rộng về Web cho khách hàng, tôi muốn chia sẻ cho các bạn cách so sánh dữ liệu giữa 2 hay nhiều tập tin, hạn chế và thế mạnh của phương thức hỗ trợ so sánh.

So Sánh Nội Dung 2 Tập Tin Sử Dụng Thư Viện Của Microsoft Visual Studio - C#

Nhược điểm của System.BitConvert trong việc chuyển mảng byte thành chuỗi  hex

  • System.BitConverter là phương thức duy nhất của C# .NET giúp chúng ta có thể chuyển đổi từ mảng byte sang chuỗi giá trị thập lục phân.

  • Khi chuyển đổi, lớp này lưu lại theo định dạng: byte1-byte2-byte3…., như vậy có thể thấy rằng, việc lưu trữ chúng không khả thi hoặc rất phức tạp trong một số dự án mà sử dụng vấn đề de-convert, tức là chuyển từ chuỗi hexa sang mảng byte.

Nhưng trong những dự án nhỏ không chú trọng phần cứng, thì việc từng bước để so sánh từng byte với nhau không là vấn đề lớn.

Sử dụng StringBuilder trong thư viện System.Text

Vì sao sử dụng StringBuilder thay vì String?

Các đối tượng String trong .NET là không đổi. Khi bạn muốn thực thi một hành động trên String, bộ thực thi hành động và chứa kết quả trên một đối tượng con, vì vậy, nếu bạn hay thao tác, xử lí trên String, thì hẳn là sẽ tốn nhiều tài nguyên, vậy nên ta dùng StringBuilder.

StringBuilder?

  • StringBuilder sẽ tạo ra một bộ đệm kí tự, vì vậy bạn có thể thoải mái thực thi trên bộ đệm này mà không lo việc bị tạo đối tượng sau mỗi lần thay đổi.

  • StringBuilder cho phép bạn thay đổi chèn, sửa chữa kiểu dữ liệu dạng khác vào đó. Và phương thức ToString() của StringBuilder là phương thức cuối cùng để chuyển nội dung của đối tượng StringBuilder thành chuỗi.

  • Nhưng cần phải cẩn thận điều gì khi sử dụng? Có 2 thuộc tính quan trọng: Capacity và Length, tương ứng kích thước bộ đệm và kích thước chuỗi.

    • Nếu thêm mới dữ liệu vào lớn hơn Capacity thì nó sẽ cấp phát thêm bộ đệm để chứa chuỗi.

    • Tốn tài nguyên khi bạn cấp phát quá mức cần thiết dữ liệu, vì thế bạn nên dự trù kích thước dữ liệu để cấp phát bộ đệm. Nếu không phải dự án lớn thì cũng không cần quan tâm nhiều.

So sánh một đoạn byte dùng StringBuilder

 

private static bool CompareByteArrToHexadecimalString(byte[] _newstring, string _oldbyte)

{

StringBuilder stringbuilder = new StringBuilder(_newstring.Length);



foreach (byte b in _newstring)

{

stringbuilder.AppendFormat("{0:X2}", b);

}



return (_oldbyte == stringbuilder.ToString());

}
  • Ở đây tôi dùng vòng lặp để chuyển mảng byte thành chuỗi, sau đó chuyển chuỗi đó gắn vào chuỗi thập lục phân của mã băm.

  • Và trả về lại kiểu luận lí bool true false.

  • “X2” có nghĩa là gì?

    • X: định dạng Hexadecimal.

    • 2 = 2 kí tự.

→ Tôi sẽ lưu nó dưới dạng ‘AB’.

So sánh một đoạn byte dùng BitConverter

 

private static void Main(string[] args)

{

// Tạo đối tượng băm

HashAlgorithm hash = HashAlgorithm.Create();



// Trường hợp so sánh 2 files, tức là args.Length==2



//Băm mã file thứ nhất

FileStream _filestreamA = new FileStream(args[0], FileMode.Open);

byte[] hashA = hash.ComputeHash(_filestreamA);

_filestreamA.Close();



//Băm mã file thứ hai

FileStream _filestreamB = new FileStream(args[1], FileMode.Open);

byte[] hashB = hash.ComputeHash(_filestreamB);

_filestreamB.Close();



if (BitConverter.ToString(hashA) == BitConverter.ToString(hashB))

{

Console.WriteLine("Trùng nhau");

}

else

{

Console.WriteLine("Không trùng");

}

}

Để tạo một mã băm, cần phải tạo một đối tượng HashAlgorithm bằng phương thức tĩnh HashAlgorithm.Create() có sẵn trong lớp System.Security.Cryptography

Sau đó gọi hash.ComputeHash để nhận một mảng byte chứa mã băm.

Lời kết

Trên đây tôi đã sử dụng StringBuilder và lớp BitConverter để so sánh dữ liệu giữa 2 file một cách cơ bản. Việc sử dụng loại nào tùy thuộc vào tính chất của dự án. Mỗi phương pháp đều có ưu điểm riêng và hạn chế như tôi đã đề cập.

Cảm ơn bạn đã đọc. Hi vọng nó sẽ giúp ích cho những bạn quan tâm tới giải pháp so sánh dữ liệu giữa 2 hoặc nhiều, sử dụng các phương thức tối ưu trong thư viện có sẵn của C#.NET.

Xem khóa đào tạo nhân sự theo danh mục!

Xem các khóa đào tạo nhân sự