涉及到字节和多字节数操作,都可以用到联合体union,联合体的存放顺序是所有成员都从低地址开始存放
介绍
大端模式:是指数据的高字节保存在内存的低地址中;
小端模式:是指数据的高字节保存在内存的高地址中;
校验大端序小端序代码核心思路
1、利用C语言的union特性:让【8位无符号数的数组】和【32位无符号数】共享存储空间。关键点:联合体的存放顺序是所有成员都从低地址开始存放。
2、C语言中,变量的地址用整个变量在存储器中的低地址表示。
3、强制类型转换,将【32位无符号数】转换为【8位无符号数】。变量的地址不变但是长度变短,那么转换之后剩余下来的值,就是真正存放在低地址的值。
4、检查低地址中存放的值是否为0x12,如果是0x12,说明最高有效字节存放在低地址,就是大字节序;否则,就是小字节序。
校验大端序小端序代码
void check_cup(void)
{
union{
int s;
char c[sizeof(int)];
}un;
un.s = 0x12345678;
if (un.c[0] == 0x12)
printf("Big endian.");
else if (un.c[0] == 0x78)
printf("Little endian.");
else
printf("Unkown");
}
大端序小端序转换
int bytes_swap_int32(int int_value)
{
int int_swapped = (
(int_value & 0x000000FF) << 24
| (int_value & 0x0000FF00) << 8
| (int_value & 0x00FF0000) >> 8
| (int_value & 0xFF000000) >> 24);
return int_swapped;
}