背景
在网络编程中,处理协议时,经常会遇到大小端序的问题,处理出错就会得到错误的结果。
一般而言,x86和arm处理器使用小端序,而PowerPC使用大端序,在网络中传输的字节使用大端序。
作为程序员,需要根据工程标准,进行大小端序的转换。
基本概念
大端序(大端模式):是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。
小端序(小端模式):是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
测试程序
1. Linux内核对大小端的处理
static union {
char c[4];
unsigned long mylong;
} endian_test = {{ 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.mylong)
if (ENDIANNESS == 'b')/* 高位在低字节 */
printf("大端序\n");
else
printf("小端序\n");
2. 使用联合体
int check_cpu_type()
{
union w {
int a;
char b;
} c;
c.a = 1;
if (c.b == 1)/* 低位低字节 */
printf("小端序\n");
else
printf("大端序\n");
}
3. 使用指针
int check_cpu_type()
{
int i = 0x1;
unsigned char *p;
p = (unsigned char *)&i;
if (*p)
printf("小端序\n");
else
printf("大端序\n");
}
总结
判断大小端序是比较基本的操作,也比较容易。
通过例程可以看到,只要理解了大小端的意义,实现的方法可以有很多种。
其他问题也是类似,只要理解了问题的核心本质,不管使用什么语言,都可以找到不止一种解决方法。
持续学习的关键就是要不断拓宽思路,提高从不同方位看问题的能力,从而找出最合适(最简最佳)解决方案。