linux之字节序

linux之字节序

大端字节序(Big-Endian)和小端字节序(Little-Endian) 是两种不同的多字节数据存储方式,主要区别在于字节在内存中的排列顺序。它们在计算机体系结构、网络通信和文件存储中非常重要。


1. 基本概念

  • 字节序(Endianness):指多字节数据(如 int, float 等)在内存中的存储顺序。
  • 核心问题:一个 32 位整数 0x12345678(十六进制),在内存中如何排列?

2. 大端字节序(Big-Endian)

  • 高字节在前,低字节在后(类似人类书写习惯)。

  • 示例0x12345678 的存储顺序:

    内存地址 存储内容
    0x1000 0x12
    0x1001 0x34
    0x1002 0x56
    0x1003 0x78
  • 特点

    • 高位字节(0x12)存储在低地址。
    • 常见场景:网络协议(如 TCP/IP)、Java 虚拟机、PowerPC 处理器。

3. 小端字节序(Little-Endian)

  • 低字节在前,高字节在后(与人类书写习惯相反)。

  • 示例0x12345678 的存储顺序:

    内存地址 存储内容
    0x1000 0x78
    0x1001 0x56
    0x1002 0x34
    0x1003 0x12
  • 特点

    • 低位字节(0x78)存储在低地址。
    • 常见场景:x86/x64 处理器、ARM(可配置)、Windows/Linux 系统。

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

C 代码示例

#include <stdio.h>

int main() {
    int num = 0x12345678;
    char *p = (char *)&num;
    if (*p == 0x78) {
        printf("Little-Endian\n");
    } else {
        printf("Big-Endian\n");
    }
    return 0;
}
  • 如果输出 Little-Endian,说明系统是小端;否则是大端。

5. 字节序的实际影响

  1. 网络通信

    • 网络协议(如 IP、TCP)默认使用 大端字节序(称为“网络字节序”)。
    • 发送数据前需调用 htonl()(Host to Network Long)转换字节序。
  2. 文件读写

    • 跨平台读取二进制文件时(如 BMP 图片),需注意字节序。
  3. 跨平台开发

    • 不同处理器(如 x86 vs PowerPC)可能使用不同字节序,需处理兼容性。

6. 记忆技巧

  • 大端:高字节在低地址(“高个子站前面”)。
  • 小端:低字节在低地址(“小个子站前面”)。

7. 总结

特性 大端字节序 小端字节序
字节顺序 高位在前(0x12... 低位在前(0x78...
常见架构 PowerPC, SPARC x86, ARM(通常)
网络协议 是(TCP/IP) 需转换
人类友好 是(类似书写顺序)

理解字节序对底层编程、网络协议和跨平台开发至关重要!

posted @ 2025-03-31 17:38  Invinc-Z  阅读(72)  评论(0)    收藏  举报