
Vì sao chuyển đổi nhị phân sang văn bản cho ra ký tự sai
Đăng ngày 24 thg 7, 2026
Một chuỗi gồm các số 0 và 1 trông có vẻ rõ ràng không thể nhầm lẫn — đó là nhị phân, không có gì để diễn giải cả. Nhưng trên thực tế, chuyển đổi nhị phân sang văn bản thất bại theo đúng nhóm nguyên nhân như chuyển đổi hex sang văn bản, vì cùng một lý do gốc rễ: một chuỗi bit không phải là văn bản cho đến khi bạn đưa ra vài giả định về cách nhóm và diễn giải nó, và chỉ cần sai một trong các giả định đó là kết quả sẽ sai theo một cách cụ thể, có thể chẩn đoán được.
Nguyên nhân 1: nhóm bit sai (7-bit so với 8-bit)
ASCII chuẩn chỉ cần 7 bit cho mỗi ký tự; hầu hết công cụ chuyển đổi nhị phân sang văn bản mặc định dùng byte 8-bit vì đó là cách văn bản thực sự được lưu trữ trên các hệ thống thực. Nếu một chuỗi nhị phân được tạo ra theo giả định nhóm 7-bit (một số ví dụ trong sách giáo khoa và hệ thống cũ vẫn làm vậy) và bạn giải mã nó như byte 8-bit, mọi ký tự đều bị lệch — ranh giới nhóm sai ngay từ bit đầu tiên, nên kết quả bị hỏng đồng đều trên toàn bộ đầu ra thay vì bắt đầu sạch sẽ rồi hỏng dần giữa chừng.
Dấu hiệu nhận biết: nếu đúng là mọi ký tự trong kết quả đều sai, không chỉ một vài ký tự, hãy kiểm tra giả định về cách nhóm bit trước tiên.
Nguyên nhân 2: một bit thừa hoặc thiếu làm lệch mọi thứ phía sau
Đây là phiên bản nhị phân của lỗi số hex lẻ — một ký tự 0 hoặc 1 bị lạc (một ký tự thừa từ copy-paste, một chữ số bị rớt mất, khoảng trắng bị phân tích nhầm thành dữ liệu) sẽ làm lệch ranh giới byte cho mọi nhóm phía sau vị trí đó. Khác với nguyên nhân 1, điều này tạo ra văn bản đúng đến một điểm rồi hỏng sau đó — một dấu hiệu mạnh cho thấy số lượng bit tự nó bị lệch ở đâu đó trong chuỗi, chứ không phải toàn bộ sơ đồ encoding bị sai.
Hãy đếm tổng số bit trước: độ dài chuỗi phải là bội số chẵn của 8 (hoặc 7, nếu bạn đã xác nhận đó là cách nhóm đang dùng). Nếu không phải, thì bit thừa hoặc thiếu chính là lỗi, chứ không phải bộ giải mã.
Nguyên nhân 3: bảng mã ký tự, giống hệt như với hex
Một khi các bit đã được nhóm đúng thành byte, bạn vẫn phải quyết định các giá trị byte đó mang ý nghĩa gì khi là ký tự — UTF-8, ASCII, Latin-1. Điều này hoàn toàn giống trường hợp hex sang văn bản: các ký tự UTF-8 nhiều byte (chữ có dấu, ký hiệu, chữ viết không phải Latin) được giải mã từng byte một như thể mỗi byte là một ký tự riêng sẽ tạo ra hai hoặc ba ký hiệu lộn xộn thay vì một ký tự đúng. Nếu việc nhóm bit đã được xác nhận đúng (loại trừ nguyên nhân 1 và 2) mà kết quả vẫn sai cụ thể ở các ký tự không phải ASCII, thì đây gần như luôn là nguyên nhân còn lại.
Nguyên nhân 4: thứ tự byte (endianness), khi nhị phân biểu diễn số chứ không phải văn bản
Nếu chuỗi nhị phân mã hóa một giá trị số thay vì dữ liệu ký tự — một tiền tố độ dài, một checksum, một ID được nhúng cạnh văn bản — thì thứ tự bit/byte rất quan trọng và không có mặc định phổ quát nào cả. 00000001 khi đứng riêng một byte thì rõ ràng không mơ hồ, nhưng các giá trị số nhiều byte có thể được lưu theo thứ tự byte có trọng số cao nhất trước hoặc byte có trọng số thấp nhất trước tùy vào hệ thống đã tạo ra nó, và đọc với giả định sai sẽ âm thầm tạo ra một con số khác, trông có vẻ hợp lý nhưng sai, chứ không phải một lỗi rõ ràng.
Chẩn đoán theo thứ tự
- Kiểm tra tổng số bit có phải là bội số chẵn của cách nhóm bạn giả định (thường là 8) — nếu số lượng lệch, đó là nguyên nhân 2, hãy sửa đầu vào.
- Nếu mọi ký tự đều sai đồng đều ngay từ đầu, hãy nghi ngờ chính kích thước nhóm bit (nguyên nhân 1) trước khi đụng đến encoding.
- Nếu kết quả sạch lúc đầu rồi hỏng dần giữa chừng, điều đó chỉ ra một bit lạc/thiếu tại vị trí đó (nguyên nhân 2), chứ không phải vấn đề encoding.
- Nếu cả cách nhóm và số lượng bit đều đúng mà chỉ các ký tự không phải ASCII trông sai, đó là vấn đề bảng mã ký tự (nguyên nhân 3).
- Nếu dữ liệu biểu diễn một con số thay vì văn bản và giá trị trông hợp lý nhưng sai, hãy kiểm tra thứ tự byte (nguyên nhân 4) trước khi cho rằng logic chuyển đổi tự nó bị hỏng.
Giống như với hex, bước chuyển đổi thực sự rất đơn giản — lỗi thực sự gần như luôn nằm ở một trong bốn giả định này, chứ không phải ở đoạn mã thực hiện việc chuyển đổi.