Hệ đếm và Mã hóa trong Máy tính

Trong lập trình và xử lý dữ liệu, việc hiểu rõ cách biểu diễn số, đơn vị đo lường và quy tắc mã hóa ký tự là nền tảng thiết yếu. Dưới đây là tổng quan kỹ thuật về các khái niệm này trong bối cảnh hệ thống máy tính và ngôn ngữ Python.

Cách thực thi mã Python

Mã Python có thể được chạy theo hai chế độ chính:

  • Chế độ script: Thực thi toàn bộ tập tin mã nguồn.
python3 /home/user/project/exercises/solution.py
  • Chế độ tương tác: Nhập từng lệnh trực tiếp vào môi trường REPL.
python3

Hệ đếm và chuyển đổi cơ số

Tất cả dữ liệu trong máy tính đều được lưu trữ dưới dạng chuỗi bit nhị phân (0 và 1), bất kể đó là văn bản, hình ảnh hay âm thanh.

Các hệ đếm phổ biến gồm:

  • Nhị phân (base-2): chỉ dùng hai ký số 0, 1.
  • Bát phân (base-8): ký số từ 0 đến 7.
  • Thập phân (base-10): hệ quen thuộc nhất với con người.
  • Thập lục phân (base-16): sử dụng chữ số 0–9 và chữ cái a–f (hoặc A–F).

Python cung cấp các hàm dựng sẵn để chuyển đổi giữa các hệ:

# Chuyển từ thập phân sang các hệ khác
binary_repr = bin(42)   # → '0b101010'
octal_repr  = oct(42)   # → '0o52'
hex_repr    = hex(42)   # → '0x2a'

# Chuyển ngược lại từ chuỗi biểu diễn sang số nguyên
decimal_from_bin = int('101010', 2)   # → 42
decimal_from_oct = int('52', 8)       # → 42
decimal_from_hex = int('2a', 16)      # → 42

Đơn vị lưu trữ dữ liệu

Vì dữ liệu được xử lý ở mức bit, các đơn vị chuẩn được định nghĩa dựa trên bội số của 2:

  • bit (b): đơn vị nhỏ nhất — một giá trị nhị phân duy nhất (0 hoặc 1).
  • byte (B): bằng 8 bit — đơn vị cơ bản để truy cập dữ liệu trong hầu hết kiến trúc máy tính.
  • KiB (kibibyte): 1024 byte (không phải 1000 — do gốc nhị phân).
  • MiB, GiB, TiB: lần lượt là $1024^2$, $1024^3$, $1024^4$ byte.

Các tiền tố lớn hơn như PiB, EiB, ZiB, YiB cũng tuân theo quy tắc nhân 1024.

Mã hóa ký tự

Mã hóa là bảng ánh xạ giữa ký tự (character) và dãy bit tương ứng, cho phép lưu trữ và truyền tải văn bản.

ASCII

Dùng 1 byte (8 bit) để biểu diễn tối đa 256 ký tự — chủ yếu phục vụ tiếng Anh và ký hiệu toán học cơ bản. Ví dụ: ký tự 'A' có mã thập phân 65 → nhị phân 01000001.

GBK và GB2312

Là các chuẩn mã hóa dành riêng cho tiếng Trung, phát triển bởi Ủy ban Tiêu chuẩn Quốc gia Trung Quốc. GB2312 (1980) hỗ trợ khoảng 6.763 ký tự Hán tự; GBK (1995) mở rộng để bao gồm thêm chữ Nhật, Hàn và ký tự bổ sung — sử dụng cả mã 1 byte (cho ASCII) và 2 byte (cho ký tự Hán).

Unicode

Là tiêu chuẩn quốc tế nhằm gán một code point duy nhất cho mỗi ký tự trên thế giới. Các dạng triển khai phổ biến:

  • UCS-2: biểu diễn cố định bằng 2 byte (16 bit) — hiện đã lỗi thời do không hỗ trợ Unicode ngoài vùng BMP.
  • UCS-4 / UTF-32: biểu diễn cố định bằng 4 byte — đảm bảo độ nhất quán nhưng tốn băng thông.

Cả hai phương pháp trên đều gây lãng phí bộ nhớ khi mã hóa ký tự ASCII (ví dụ: 'A' vẫn chiếm 2 hoặc 4 byte thay vì 1).

UTF-8

Là mã hóa biến chiều phổ biến nhất hiện nay, được thiết kế để tương thích ngược với ASCII và tối ưu dung lượng:

Phạm vi code point (hex) Số byte trong UTF-8 Mẫu bit
U+0000U+007F 1 0xxxxxxx
U+0080U+07FF 2 110xxxxx 10xxxxxx
U+0800U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
U+10000U+10FFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Ví dụ:

  • 'B' có code point U+0042 → nằm trong dải 1-byte → mã hóa thành 01000010.
  • '武' có code point U+6B66 → dải 3-byte → mã hóa thành 11100110 10101101 10100110.
  • '😆' có code point U+1F606 → dải 4-byte → mã hóa thành 11110000 10011111 10011000 10000110.

Xử lý mã hóa trong Python

Python phân biệt rõ ràng giữa:

  • str: chuỗi ký tự Unicode (được xử lý nội bộ trong bộ nhớ).
  • bytes: dãy byte nhị phân (dùng khi ghi file, gửi mạng hoặc tương tác với hệ thống).

Chuyển đổi giữa hai loại:

text = "Xin chào Việt Nam"
utf8_bytes = text.encode("utf-8")   # str → bytes
gbk_bytes  = text.encode("gbk")     # cần cài đặt hỗ trợ nếu dùng trên hệ thống không có GBK

# Ghi vào tệp nhị phân
with open("output.bin", "wb") as f:
    f.write(utf8_bytes)

Thẻ: python Unicode utf8 encoding binary

Đăng vào ngày 21 tháng 6 lúc 02:35