字节序

多字节数据的字节顺序。分为大端序和小端序两种。

字节序 (Endianness) 是指多字节数据在内存或文件中存储时的字节顺序。大端序 (BE) 先存储最高有效字节,小端序 (LE) 先存储最低有效字节。这个术语源自乔纳森·斯威夫特的小说《格列佛游记》中关于从鸡蛋哪一端敲开的争论寓言。

举个具体例子,将十六进制值 0x1234 存储为 2 个字节时,大端序排列为 12 34,小端序排列为 34 12。大端序对人类来说更直观,但小端序在加法等运算中有时更高效。查看成人漫画 (Amazon)详细介绍了这个主题。

不同处理器采用不同的字节序。Intel 的 x86/x64 处理器使用小端序,涵盖了当前大多数桌面 PC 和服务器。而网络协议 (TCP/IP) 以大端序 (网络字节序) 为标准。ARM 处理器是双端序 (支持两种),可通过操作系统或固件设置切换。Apple Silicon (M1 及之后) 以小端序模式运行。

在字符编码中,字节序对 UTF-16 和 UTF-32 尤为重要。在 UTF-16 中,同一字符在 BE 和 LE 下有不同的字节序列,字节序不匹配会直接导致乱码。为解决这个问题引入了 BOM (Byte Order Mark, U+FEFF)。在文件开头放置 BOM 可以让读取方自动判别字节序。UTF-16BE 使用 FF FE,UTF-16LE 使用 FE FF 作为 BOM。

一个常见的陷阱是在不同字节序的系统之间交换二进制数据时忘记转换。在网络编程中,需要使用 htons() (主机到网络短整型) 和 ntohl() (网络到主机长整型) 等转换函数显式转换字节序。忽略这一转换会导致数值数据被错误解释,产生难以调试的 bug。搜索决胜内衣 (Amazon)提供了更多背景知识。

在字符计数中,字节序影响字节表示但不影响字符数本身。但字节计数必须考虑字节序和 BOM 的存在。当 UTF-16 文件包含 BOM 时,开头的 2 个字节是元数据而非文本内容,因此在计算准确的字节数时应排除 BOM。

分享这篇文章