判断字节序大小端的程序
- #include "stdio.h"
-
#include "unistd.h"
-
-
/************ 最简单方式 *********/
-
static union {
-
char c[4];
-
unsigned long l;
-
} endian_test = {
-
{ 'l', '?', '?', 'b' }
-
};
-
-
#define ENDIANNESS ((char)endian_test.l)
-
/*************************/
-
-
int main(void)
-
{
-
union{
-
short s;
-
char c[sizeof(short)];
-
} un;
-
-
un.s = 0x0102;
-
-
if(sizeof(short) == 2){
-
printf("%02x\n",un.c[0]);
-
printf("%02x\n",un.c[1]);
-
if(un.c[0] == 1 && un.c[1] == 2)
-
printf("big-endian\n");
-
else if(un.c[0] == 2 && un.c[1] == 1)
-
printf("little-endian\n");
-
else
-
printf("unknown\n");
-
}
-
else
-
printf("sizeof(short)=%d\n",sizeof(short));
-
-
return 0;
-
}
对于上层应用程序,如果你总是直接对内存进行char操作,即一个字节一个字节的操作,没字节序问题
当使用的基本数据类型的大小多于一个字节时,如int,就有字节序的问题了
比如同样一个数字0x0102,不同字节序的平台,内存存储方式不一样
字节序 低-高 地址
大端 01 02
小端 02 01
内核编程时,也要考虑大小端问题。
- struct iphdr {
-
#if defined(__LITTLE_ENDIAN_BITFIELD)
-
__u8 ihl:4,
-
version:4;
-
#elif defined (__BIG_ENDIAN_BITFIELD)
-
__u8 version:4,
-
ihl:4;
-
#else
-
#error "Please fix "
-
#endif
-
__u8 tos;
-
__be16 tot_len;
-
__be16 id;
-
__be16 frag_off;
-
__u8 ttl;
-
__u8 protocol;
-
__sum16 check;
-
__be32 saddr;
-
__be32 daddr;
-
/*The options start here. */
-
};
---------------------------------------- 华丽的分割线 -------------------------------------
高位 低位
大端 bit0 bit32
小端 bit32 bit0
datasheet是这样子的吗?
阅读(4112) | 评论(0) | 转发(1) |