检测系统的字节顺序【大端模式 | 小端模式】

   检测系统的字节顺序【大端模式  |  小端模式】   

 

大(小)端模式:

  大端模式是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,

这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

小端模式与“大端模式”相反,数据的高位保存在内存的高地址中,数据的地位保存在内存的低地址中。

例如:

我把 0x0102 存入一个 short 短整形(2个字节)中,如果低地址中存放的是 2, 而高地址中存放的是 1,那么就是小端模式,

反之则是大端模式。

 

描述系统属性的结构体:

struct utsname {
    char sysname[];    /* Operating system name (e.g., "Linux") */
    char nodename[];   /* Name within "some implementation-defined network" */
    char release[];    /* OS release (e.g., "2.6.28") */
    char version[];    /* OS version */
    char machine[];    /* Hardware identifier */
#ifdef _GNU_SOURCE
    char domainname[]; /* NIS or YP domain name */
#endif
};

 

相关函数:

/* Put information about the system in NAME.  */
extern int uname (struct utsname *__name) __THROW;

 

测试代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <sys/utsname.h>
 4 
 5 int main()
 6 {
 7     union{
 8         short inum;
 9         char  c[sizeof(short)];
10     }un;
11 
12     struct utsname uts;
13 
14     un.inum = 0x0102;
15 
16     /* 获取系统信息 */
17     if(uname(&uts) < 0)
18     {
19         printf("Can't get the host information ...\n");
20         exit(-1);
21     }
22 
23     printf("%s-%s-%s:  ", uts.machine, uts.sysname, uts.release);
24 
25     /* 如果 short 不是两个字节 */
26     if(sizeof(short) != 2)
27     {
28         printf("sizoef short = %d\n", sizeof(short));
29         exit(0);
30     }
31 
32     /* 小端模式 */
33     if(un.c[0] == 2 && un.c[1] == 1)
34         printf("Little_endian !\n");
35     /* 大端模式 */
36     else if(un.c[0] == 1 && un.c[1] == 2)
37         printf("Big_endian !\n");
38     else
39         printf("unknow !\n");
40 
41     return 0;
42 }

 

 运行截图:

当然,不同的系统,得到的结果可能不同!

 

 

posted @ 2012-06-03 16:42  hp+y  Views(660)  Comments(0Edit  收藏  举报