Hôm trước kết thúc môn Lập trình mạng, có một câu hỏi yêu cầu chuyển đổi từ số long decimal về decimal dạng A.B.C.D (ví dụ như 10.10.10.1 chẳng hạn). Đáp án là 192.168.1.1 trong khi tôi ghi đại trong bài là 192.168.1.2 =))))))))))

Bữa đó không nhớ cách làm, nhưng cuối giờ ráng hỏi đứa bạn nên cũng đúng được câu đó =))))

Dĩ nhiên nếu đó là môn đại cương thì kiểu gì tôi cũng bỏ qua, cái gì qua rồi cho qua luôn, cắng đắng nhai đi nhai lại quá khứ được cái tích sự gì. Nhưng môn này là môn ngành, một phần nữa là không hiểu cái động lực gì nhưng thời gian này tôi đâm ra mê nghiền ngẫm code. Nên sau đó về nhà tôi có làm lại. Vẫn không hiểu nguyên lý cách nào mà nó chuyển hóa ra được từ số long ra dạng decimal.

Tôi quyết định lên stackoverflow hỏi cho ra vấn đề.

Và sau khi nói qua nói lại vài lời, tôi hiểu ra được cách làm. Có một cách ban đầu nhưng tác giả nó cảm thấy khó hiểu, chưa đúng với ý tôi muốn hỏi nên anh ta xóa đi, thay cách khác đơn giản hơn. May mắn là tôi có kịp thấy trước khi nó bị xóa.

Yêu cầu đề bài: Cho số 16885952, hãy chuyển đổi ra số thập phân của dạng IP Address.

IPAddress ip = new IPAddress(16885952);
Byte[] b = new Byte[4];
b = ip.GetAddressBytes();
Console.WriteLine(“Address: ” + b[0] + “.” + b[1] + “.” + b[2] + “.” + b[3]);

Đây là code minh họa tìm đáp án trong C#. Debug cũng không thấy được cách nó chuyển đổi thế nào. Sau đây là 2 cách thực hiện bằng tay, thực ra cách 1 thích hợp với ai có máy tính cầm tay hơn.

Cách 1:

Ta lấy số 16885952, chuyển sang dạng Hexa thu được số 0x101A8C0. Minh họa bằng code luôn:

int intValue = 16885952;

string hexValue = intValue.ToString(“X”);

Console.WriteLine(hexValue);

Nếu muốn bấm máy tính Casio thì bấm phím Mode => 4: BASE-N. Tiếp tục khi màn hình xuất hiện Dec kèm số 0 thì nhập vào số 16885952 và nhớ nhấn phím dấu “=”. Sau đó, bấm nút có chữ HEX xanh lá phía trên đầu. Như vậy là thu được số hexa của số 16885952.

This slideshow requires JavaScript.

Sau khi thu được số hexa tương ứng, bạn phân tích nó ra.

101A8C0 = C0.A8.01.01

Tiếp tục, để máy tính ở dạng Hex và nhập C0 vào, nhấn dấu “=”. Sau đó bấm nút có chữ DEC xanh lá ở trên để thu được số decimal của nó. Thực hiện tương tự cho các số còn lại ta có được kết quả:

C0 = 192

A8 = 168

01 = 1

01 = 1

Nếu muốn bấm các chữ A, B, C, D,.. trong hệ hexa thì nhìn vào dãy phím thứ 6 từ dưới đếm lên sẽ thấy ngay. Muốn nhấn A thì cứ bấm vào phím có chữ A đỏ, không cần nhấn phím Alpha nhé.

Như vậy, kết quả thu được của dạng thập phân cách nhau bởi dấu chấm sau khi chuyển từ long về dạng IP Address của 16885952 là 192.168.1.1.

Thế nếu để nguyên dãy hexa ban đầu bấm luôn một mạch có được không? Câu trả lời là không!

Cách 2:

Cách này dễ chịu hơn nhiều. Chỉ cần thực hiện một số tính toán chia và chia lấy dư là ra.

16885952 % 256 = 192

16885952 / 256 % 256 = 168

16885952 / 256 / 256 % 256 = 1

16885952 / 256 / 256 / 256 = 1

Kết quả thu được vẫn là đáp án đúng 192.168.1.1 như ở cách 1. Cách 2 phù hợp cho việc đi thi hơn, vì không hẳn ai cũng dùng Casio đời cao cấp, như tôi chẳng hạn :”) Tôi lỡ bỏ tiền mua cái máy 500VN PLUS hồi năm lớp 10, sau đó cắn răng chịu trận xài nó chứ không dám xin tiền mua cái xịn như chúng bạn. Nhớ hồi đó bạn bè cứ việc dùng máy dòng 570 bấm xoẹt xoẹt nhiều cái, trong khi máy tôi dùng chịu chết không làm nhanh được, phải giải tay ì ạch… Nhớ hoài…

VÕ TÌNH THƯƠNG

votinhthuong9@gmail.com