2026/6/11 11:38:47
网站建设
项目流程
网站做搜索关键字好吗,第三方电子商务平台有哪些优势,那个网站做二手车好,大庆免费网站建设详解网络字节序与大小端模式 (Network Byte Order Endianness)
本文详细讲解计算机系统中的字节序#xff08;Byte Order#xff09;概念#xff0c;包括大端模式#xff08;Big-Endian#xff09;和小端模式#xff08;Little-Endian#xff09;的区别、内存布局…详解网络字节序与大小端模式 (Network Byte Order Endianness)本文详细讲解计算机系统中的字节序Byte Order概念包括大端模式Big-Endian和小端模式Little-Endian的区别、内存布局以及网络编程中必须遵守的网络字节序规则。1. 什么是字节序 (Byte Order)在计算机中数据是以**字节Byte**为单位存储的。一个字节包含8位bit。对于单字节的数据如char存储和处理都很简单不存在顺序问题。然而对于多字节数据如int,short,long等它们占用多个字节。例如一个 32 位的整数0x12345678占用 4 个字节。当我们要把这 4 个字节存储到内存中时就涉及到一个顺序问题是先把高位字节0x12存到低地址还是先把低位字节0x78存到低地址这就引出了字节序的概念。核心术语MSB (Most Significant Byte): 最高有效字节。在0x12345678中0x12是 MSB。LSB (Least Significant Byte): 最低有效字节。在0x12345678中0x78是 LSB。2. 大端模式 (Big-Endian)定义数据的高位字节MSB存储在内存的低地址端低位字节LSB存储在内存的高地址端。特点符合人类的阅读习惯从左到右。也就是高位在低地址。内存布局示意图假设我们有一个 32 位整数0x12345678存储在起始地址为A的内存中。Mermaid 示意MemoryAddress A1 : 0x34Address A2 : 0x56Address A : 0x12(MSB)Address A3 : 0x78(LSB)3. 小端模式 (Little-Endian)定义数据的低位字节LSB存储在内存的低地址端高位字节MSB存储在内存的高地址端。特点符合计算机处理逻辑低位先处理。也就是低位在低地址。常见的 x86 架构Intel, AMD都是小端模式。内存布局示意图同样是 32 位整数0x12345678存储在起始地址为A的内存中。Mermaid 示意MemoryAddress A1 : 0x56Address A2 : 0x34Address A : 0x78(LSB)Address A3 : 0x12(MSB)4. 大端与小端的对比特性大端模式 (Big-Endian)小端模式 (Little-Endian)存储顺序MSB - 低地址LSB - 低地址可读性好符合人类阅读习惯差逆序存储典型架构PowerPC, IBM,网络协议x86 (Intel/AMD), ARM (默认)判定口诀高尾端(高位在低地址)低尾端(低位在低地址)5. 网络字节序 (Network Byte Order)在网络通信中不同的计算机可能采用不同的字节序例如一台是大端机一台是小端机。为了保证数据在传输过程中的正确性TCP/IP 协议规定了统一的网络字节序。规定网络字节序采用大端模式 (Big-Endian)。这意味着发送方主机在发送数据前必须将数据从主机字节序 (Host Byte Order)转换为网络字节序。接收方主机在接收数据后必须将数据从网络字节序转换为主机字节序。转换函数 (C/C)操作系统提供了一组标准函数来进行转换通常在arpa/inet.h或netinet/in.h中。h代表 host (主机)n代表 network (网络)s代表 short (16位用于端口号)l代表 long (32位用于IP地址)函数名作用解释htons()Host to Network Short主机字节序 - 网络字节序 (16位)htonl()Host to Network Long主机字节序 - 网络字节序 (32位)ntohs()Network to Host Short网络字节序 - 主机字节序 (16位)ntohl()Network to Host Long网络字节序 - 主机字节序 (32位)6. 代码实战检测当前系统的字节序我们可以编写一段简单的 C 代码来检测当前机器是是大端还是小端。方法一使用联合体 (Union)联合体的所有成员共享同一块内存。#includestdio.hintcheck_endian_union(){union{inti;charc;}u;u.i1;// 0x00000001// 如果是小端内存中是 01 00 00 00c 取低地址字节为 1// 如果是大端内存中是 00 00 00 01c 取低地址字节为 0return(u.c1);}intmain(){if(check_endian_union()){printf(当前系统是小端模式 (Little-Endian)\n);}else{printf(当前系统是大端模式 (Big-Endian)\n);}return0;}方法二使用指针强制转换#includestdio.hintcheck_endian_pointer(){inti1;// 0x00000001// 将 int 指针强制转为 char 指针指向最低地址的一个字节char*c(char*)i;// 如果 *c 是 1说明低地址存的是 0x01 (低位)即小端return(*c1);}intmain(){if(check_endian_pointer()){printf(当前系统是小端模式 (Little-Endian)\n);}else{printf(当前系统是大端模式 (Big-Endian)\n);}return0;}7. 总结字节序是多字节数据在内存中的存储顺序。大端模式高位在低地址符合阅读习惯网络标准。小端模式低位在低地址x86架构标准。网络通信必须统一使用大端模式作为网络字节序。编程实践在涉及网络传输时务必使用htons,htonl等函数进行转换不要假设对方的机器字节序。