大小端字节序

大小端字节序(Endianness)是指多字节数据(如整数、浮点数等)在计算机内存中的存储序。主要有两种类型的大小端字节序:大端(Big-endian)和小端(Little-endian)。

4.6.1 大端字节序(Big-endian)

在大端字节序中,多字节数据的最高有效字节(MSB)存储在最低的内存地址处,而最低有效字节(LSB)存储在最高的内存地址处。这种字节序有时被称为"网络字节序",因为它是网络协议中用的标准字节序。

例如:假设有一个16位的的数据

内存地址 数据

0x00 0x12

0x01 0x34

4.6.2 小端字节序(Little-endian)

在小端字节序中,多字节数据的最低有效字节(LSB)存储在最低的内存地址处,而最高有效字(MSB)存储在最高的内存地址处。

使用同样的16位整数 0x1234 ,在小端字节序中的存储方式如下:

内存地址 数据

0x00 0x34

0x01 0x12

4.6.3 大小端字节序的影响

大小端字节序的不同会导致相同的数据在不同的计算机架构之间传输时需要进行字节序转换如,如

果一个在大端字节序计算机上创建的文件被传输到小端字节序计算机上,那么文件中的多字节数据需要被正确解释。

4.6.4 如何检测大小端

在C语言中,可以通过一个简单的宏来检测系统的字节序:

cs 复制代码
#include <stdio.h>

// 定义变量存储1,用于获取可寻址的内存
static const int check_endian = 1;

// 修正宏:通过变量的地址来检测字节序
#define IS_BIG_ENDIAN    ((unsigned char)1 == ((unsigned char *)&check_endian)[sizeof(int) - 1])
#define IS_LITTLE_ENDIAN ((unsigned char)1 == ((unsigned char *)&check_endian)[0])
int main() {
    if (IS_LITTLE_ENDIAN) {
        printf("System is Little-Endian (小端模式).\n");
    } else if (IS_BIG_ENDIAN) {
        printf("System is Big-Endian (大端模式).\n");
    } else {
        printf("System is of unknown endianness.\n");
    }
    return 0;
}

注意:在对数据进行取地址的时候必须是定义这个变量进行初始化,否者编译器在编译的时候会报错的

案例2:

cs 复制代码
#include <stdio.h>

// 定义一个结构体,其中包含一个char成员和一个int成员
typedef struct {
    char c; // 1字节
    int i;  // 4字节(大多数现代系统)
} CheckEndian;

int main() {
    CheckEndian check;
    check.c = 1; // 将char成员设置为1,即内存中的最低有效字节为1

    // 根据int成员的值来判断字节序
    if (*(unsigned char *)&check.i == 1) {
        printf("Little-endian system.\n");
    } else {
        printf("Big-endian system.\n");
    }

    return 0;
}

处理的思维是一样的,只是通过结构体来访问结构体的成员变量而已。

相关推荐
爱吃奥利奥_wen4 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
wflynn15 小时前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github·nvidia·amd·directx12
疯狂的维修1 天前
关于用C#写电机起保停控制
开发语言·c#
用户788477316341 天前
门店核销闭环:小程序扫码 + .NET 幂等接口 + WPF 看板,一天能跑通
微信小程序·c#
samble2 天前
从零搭建灌装监控系统(十三):报警系统设计,生命周期与通知
c#·wpf·mvvm·modbus·工业控制
miofly2 天前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github
周杰伦fans2 天前
8GB显存下模型量化实战指南
人工智能·后端·c#
samble2 天前
从零搭建灌装监控系统(十二):配置系统,原子写入与容错
c#·wpf·mvvm·modbus·工业控制
流形填表2 天前
题库去重实战:基于题干指纹的重复题清理
开发语言·c#
开开心心就好3 天前
以图搜图找重复图片,本地工具离线就能用
javascript·智能手机·ffmpeg·c#·ocr·word·音视频