当前位置: 首页 > ops >正文

大端序与小端序

理解大端序(Big-Endian)和小端序(Little-Endian)的关键在于数据在内存中存储时字节的排列顺序,特别是在存储多字节数据类型(如整数、浮点数)时。以下是清晰易懂的解释:


核心概念

假设有一个 32位(4字节)整数 0x12345678(十六进制表示),其最高位字节是 0x12,最低位字节是 0x78。它在内存中的存储方式如下:

1. 大端序(Big-Endian)
  • 高位字节在前,低位字节在后(符合人类阅读习惯)。
  • 内存地址从低到高的顺序:0x120x340x560x78
    低地址 ----------------→ 高地址
    +----+----+----+----+
    | 12 | 34 | 56 | 78 |
    +----+----+----+----+
    
2. 小端序(Little-Endian)
  • 低位字节在前,高位字节在后(符合计算机处理习惯)。
  • 内存地址从低到高的顺序:0x780x560x340x12
    低地址 ----------------→ 高地址
    +----+----+----+----+
    | 78 | 56 | 34 | 12 |
    +----+----+----+----+
    

💡 记忆口诀

  • 大端序:高位在地址(“大端”像领导坐前排)。
  • 小端序:低位在地址(“小端”像倒着放)。

为什么需要字节序?

计算机以字节为单位访问内存,但数据类型(如 intfloat)可能占用多个字节。不同硬件平台选择不同字节序:

  • 大端序:Sun SPARC、IBM z/Architecture(大型机)、网络传输(网络字节序默认大端)。
  • 小端序:x86/x64(Intel/AMD)、ARM(可配置)、Android/iOS设备。

实际影响

1. 跨平台数据传输
  • 如果一台小端机向大端机发送 int 数据而不转换,接收方会解析错误!
  • 解决方案:统一用 大端序 作为网络传输标准(称为 网络字节序),通过函数转换:
    htons() // 主机序转网络序(short类型)
    ntohl() // 网络序转主机序(long类型)
    
2. 代码中的陷阱
int num = 0x12345678;
char* p = (char*)# // 用char指针访问int的每个字节
// 小端机上:p[0] = 0x78, p[1] = 0x56, ...
// 大端机上:p[0] = 0x12, p[1] = 0x34, ...

结论:直接操作内存字节时,必须考虑字节序!


如何判断当前系统字节序?

用C代码检测:

#include <stdio.h>int main() {int num = 0x1;char *p = (char*)#if (*p == 1) {printf("Little-Endian\n"); // 低位字节在低地址} else {printf("Big-Endian\n");    // 高位字节在低地址}return 0;
}

典型应用场景

  1. 网络协议(如IP/TCP头部)
    • 所有字段均按大端序传输,确保跨平台兼容性。
  2. 文件格式(如BMP图片、ELF可执行文件)
    • 文件头中明确指定字节序(BMP用小端,JPEG用大端)。
  3. 硬件寄存器
    • 设备驱动的寄存器数据需按硬件要求的字节序读写。

总结

特性大端序 (Big-Endian)小端序 (Little-Endian)
排列顺序高位字节 → 低位字节低位字节 → 高位字节
低地址内容数据最高有效字节(MSB)数据最低有效字节(LSB)
常见平台网络传输、IBM大型机x86/x64、ARM、Windows/Linux
优势人类易读、统一网络标准硬件处理高效(加法从低位开始)

理解字节序能避免跨平台数据解析错误,是处理底层数据、网络编程和系统兼容性的基础!

http://www.xdnf.cn/news/15503.html

相关文章:

  • 【机器学习】数据理解:数据导入、数据审查与数据可视化
  • 2.库操作
  • 自动驾驶激光3D点云处理系统性阐述及Open3D库函数应用
  • 百炼Agent MCP与IoT实战(二):阿里云MQTT Broker配置
  • 控制Vue对话框显示隐藏
  • fastadmin会员单点登录
  • python的慈善捐赠平台管理信息系统
  • MyBatis详解以及在IDEA中的开发
  • 数据结构与算法学习(一)
  • 个人笔记(linux/tr命令)
  • LVS:高性能负载均衡利器
  • Java的Gradle项目,使用SLF4J+Log4j2+log4j2.xml
  • C++ 计数排序、归并排序、快速排序
  • Elasticsearch+Logstash+Filebeat+Kibana部署
  • xss作业
  • uniapp
  • 2025秋招突围战:AI智能监考如何重构远程笔试公平防线?
  • 深入解析 AWS RDS Proxy
  • 达梦数据库配置兼容MySQL
  • 从 “洗澡难” 到 “洗得爽”:便携智能洗浴机如何重塑生活?
  • Vue 结合 Zabbix API 获取服务器 CPU、内存、GPU 等数据
  • LabVIEW Occurrence功能
  • go项目实战
  • 高频面试雷区:Java Object六大核心方法源码剖析
  • Linux Ubuntu apt包管理器安装K8s1.30.1+Ingress-Nginx
  • fastadmin中ajax弹窗修改文字为英文
  • AJAX 技术
  • MinIO介绍以及结合SpringBoot的应用场景详解
  • 数据降维方法:PCA
  • 微算法科技研究量子视觉计算,利用量子力学原理提升传统计算机视觉任务的性能