Endianness
Thứ tự byte của dữ liệu đa byte. Có hai loại: big-endian và little-endian.
Endianness là thứ tự byte khi lưu trữ dữ liệu đa byte trong bộ nhớ hoặc tệp. Big-endian (BE) lưu byte quan trọng nhất trước, trong khi little-endian (LE) lưu byte ít quan trọng nhất trước. Thuật ngữ này bắt nguồn từ tiểu thuyết "Gulliver's Travels" của Jonathan Swift, nơi các phe phái tranh luận về việc đập trứng từ đầu nào.
Ví dụ cụ thể, khi lưu giá trị thập lục phân 0x1234 trong 2 byte, big-endian sắp xếp là 12 34, trong khi little-endian sắp xếp là 34 12. Big-endian trực quan hơn cho con người, nhưng little-endian có thể hiệu quả hơn cho các phép toán như cộng. Sách kiến trúc máy tính bao gồm chủ đề này chi tiết.
Các bộ xử lý khác nhau áp dụng endianness khác nhau. Bộ xử lý Intel x86/x64 sử dụng little-endian, bao phủ phần lớn PC desktop và máy chủ hiện tại. Mặt khác, các giao thức mạng (TCP/IP) chuẩn hóa trên big-endian (thứ tự byte mạng). Bộ xử lý ARM là bi-endian (hỗ trợ cả hai), có thể chuyển đổi qua cài đặt OS hoặc firmware. Apple Silicon (M1 trở lên) hoạt động ở chế độ little-endian.
Trong mã hóa ký tự, endianness đặc biệt quan trọng cho UTF-16 và UTF-32. Trong UTF-16, cùng ký tự có chuỗi byte khác nhau trong BE và LE, vì vậy không khớp endianness trực tiếp gây ra lỗi ký tự. BOM (Byte Order Mark, U+FEFF) được giới thiệu để giải quyết vấn đề này. Đặt BOM ở đầu tệp cho phép trình đọc tự động phát hiện endianness. UTF-16BE sử dụng FF FE và UTF-16LE sử dụng FE FF làm BOM.
Một cạm bẫy phổ biến là quên chuyển đổi thứ tự byte khi trao đổi dữ liệu nhị phân giữa các hệ thống có endianness khác nhau. Trong lập trình mạng, các hàm chuyển đổi như htons() (host to network short) và ntohl() (network to host long) phải được sử dụng để chuyển đổi thứ tự byte rõ ràng. Bỏ qua chuyển đổi này khiến dữ liệu số bị hiểu sai, dẫn đến lỗi khó gỡ. Sách lập trình cấp thấp cung cấp thêm ngữ cảnh.
Đối với đếm ký tự, endianness ảnh hưởng đến biểu diễn byte nhưng không ảnh hưởng đến số ký tự. Tuy nhiên, đếm byte phải xem xét endianness và sự có mặt của BOM. Khi tệp UTF-16 bao gồm BOM, 2 byte đầu là siêu dữ liệu chứ không phải nội dung văn bản, vì vậy loại trừ BOM khi tính số byte chính xác là phù hợp.