字节序判断

字节序(Byte Order),也称为端序(Endianness),是指多字节数据类型(如整数、浮点数等)在计算机内存中的存储顺序。

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

    • 最高位字节存储在最低地址处。
    • 适用于网络传输,因为 Internet 协议族(如 TCP/IP)通常使用大端字节序。
    • 示例:整数 0x12345678 存储为 [12][34][56][78]
  2. 小端字节序(Little-Endian)

    • 最低位字节存储在最低地址处。
    • 常见于 x86 架构的处理器。
    • 示例:整数 0x12345678 存储为 [78][56][34][12]

在嵌入式系统中,字节序非常重要,特别是在以下几个方面:

  1. 数据传输

    • 当数据在网络中传输时,发送方和接收方必须使用相同的字节序,否则数据会被错误地解释。
    • 例如,TCP/IP 协议栈中的网络字节序(大端字节序)需要在发送前进行转换。
  2. 文件格式

    • 许多文件格式(如 PNG、JPEG 等)规定了特定的字节序,读取这些文件时需要遵循相应的字节序规则。
  3. 多平台兼容性

    • 当数据在不同架构的系统之间交换时,字节序的不一致会导致数据错误。例如,一个大端字节序的系统生成的数据文件在小端字节序的系统上可能无法正确解析。

字节序的判断

  • 联合体方法判断方法

    利用union结构体的从低地址开始存,且同一时间内只有一个成员占有内存的特性

    #include<stdio.h>
    int main(){
    union w
    {
    int a;
    char b;
    }c;
    c.a = 1;
    if(c.b == 1)
    printf("小端存储\n");
    else
    printf("大端存储\n");
    return 0;
    }
  • 指针

    通过将int强制类型转换成char单字节,p指向a的起始字节(低字节)

    #include <stdio.h>
    int main ()
    {
    int a = 1;
    char *p = (char *)&a;
    if(*p == 1)
    {
    printf("小端存储\n");
    }
    else
    {
    printf("大端存储\n");
    }
    return 0;
    }

字节序转换函数

C 标准库提供了几个函数来处理字节序转换:

  1. htons()ntohs()

    • htons():将主机字节序转换为网络字节序(16 位)。
    • ntohs():将网络字节序转换为主机字节序(16 位)。
  2. htonl()ntohl()

    • htonl():将主机字节序转换为网络字节序(32 位)。
    • ntohl():将网络字节序转换为主机字节序(32 位)。
posted @   libq8  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示