Search…

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

17/07/20203 min read
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 các phương thức hỗ trợ so sánh trong C#.

Các kiến thức cần chuẩn bị

  • Nhược điểm của System.BitConvert trong việc chuyển mảng byte thành chuỗi hex.
  • Sử dụng StringBuilder trong thư viện System.Text.

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.

Về việc tối ưu xử lý chuỗi với StringBuilder để hiểu rõ hơn bạn có thể tham khảo thêm tại đây.

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.

Tham khảo

  • Thư viện System.Text;
  • Thư viện System.Security.Cryptography;
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024