Ubuntu扬声器没声音?从ALSA到PipeWire的驱动排查与修复指南
2026/10/20 3:03:52
大小端模式(Endianness)是指多字节数据在计算机内存中存储顺序的差异,主要涉及高位字节和低位字节的存放位置 。
| 模式名称 | 定义描述 | 存储顺序示例 (0x12345678) | 形象比喻 | 常见架构 |
|---|---|---|---|---|
| 大端模式 (Big-Endian) | 数据的高位字节保存在内存的低地址中,低位字节保存在高地址中 | 低地址 →12345678← 高地址 | “大”头在前,符合人类阅读习惯 | 网络协议 (TCP/IP)、Motorola 68k、部分 ARM (可配置) |
| 小端模式 (Little-Endian) | 数据的低位字节保存在内存的低地址中,高位字节保存在高地址中 | 低地址 →78563412← 高地址 | “小”头在前,符合 CPU 从低地址读取习惯 | x86/x64 架构、大多数现代 PC、Android/iOS 设备 |
注:地址增长方向通常定义为从左向右(低→高)。
以下提供两种经典的 C 语言检测方法:联合体法(最常用)和指针法。
利用联合体成员共享同一块内存空间的特性,通过写入整型值并读取字符型值来判断 。
#include<stdio.h>/** * 使用联合体判断系统字节序 * 原理:int 和 char 共享首地址。若 int 的低位字节存储在低地址,则 char 读取到的就是低位值。 */intcheck_endian_union(){union{inti;charc;}un;un.i=1;// 如果系统是小端,1 (0x...0001) 的低位字节 0x01 存在低地址,un.c 读取到 1// 如果系统是大端,1 的高位字节 0x00 存在低地址,un.c 读取到 0if(un.c==1){return1;// 小端模式 (Little-Endian)}else{return0;// 大端模式 (Big-Endian)}}intmain(){if(check_endian_union()){printf("当前系统为:小端存储 (Little-Endian)\n");}else{printf("当前系统为:大端存储 (Big-Endian)\n");}return0;}直接取整型变量的地址,强制转换为字符指针,读取第一个字节的内容 。
#include<stdio.h>/** * 使用指针强制转换判断系统字节序 * @return 1 表示小端,0 表示大端 */intcheck_endian_pointer(){intnum=1;// 取 num 的地址,强转为 char*,只读取最低地址的一个字节char*ptr=(char*)#// 若最低地址字节为 1,说明低位存低址 -> 小端if(*ptr==1){return1;}return0;}htonl()/htons()进行转换,接收后调用ntohl()/ntohs()还原,否则会导致数据解析错误 。float,int32_t)会完全错乱 。