Chinaunix首页 | 论坛 | 博客
  • 博客访问: 268149
  • 博文数量: 99
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 246
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-03 18:23
个人简介

qrasvasdf

文章分类

全部博文(99)

文章存档

2016年(1)

2015年(36)

2014年(62)

我的朋友

分类: LINUX

2015-03-30 11:07:02

这本来是很easy的东东,不过今天看到一段判断主机是大端模式还是小端模式的例子,和以前的常见的例子略有不同,更严密一些,故note一下:


大端:多字节值的大端存储在该值的起始位置;(老大站排头为大)

小端:多字节值的小端存储在该值的起始位置;(老小站排头为小)

例如16bit整数:0x0102,其中01即为多字节值的大端,02即为多字节值的小端。

在网络中传输的都是大端序,但具体到某台主机CPU的实现,则有可能是大端序也可能是小端序。一般X86是小端。

那么,如何通过程序来判断当前主机到底是大端还是小端呢?

常见方法:

  1. /*判断大端还是小端, 1:小端  0:大端*/  
  2. int GetEndian()  
  3. {  
  4.     union  
  5.     {  
  6.         int a;  
  7.         char b;  
  8.     } s;  
  9.     s.a = 0x0001;  
  10.     return (1 == s.b);  
  11. }  

联合体union的存放顺序是所有成员都从低地址开始存放,给s.a赋值为0x01,00为a的高端,01为a的低端,如果b==1,即a的低端位于起始位置,即小端,反之为大端。


《UNIX网络编程》(第一卷)给的方法:

  1. /*判断大端还是小端, 1:小端  0:大端*/  
  2. int GetEndian()  
  3. {  
  4.     union  
  5.     {  
  6.         short s;  
  7.         char c[sizeof(short)];  
  8.     }un;  
  9.   
  10.     un.s = 0x0102;  
  11.   
  12.     if(2 == sizeof(short))  
  13.     {  
  14.         if(1 == un.c[0] && 2 == un.c[1])  
  15.         {  
  16.             printf("big-endian\n");  
  17.             return 0;  
  18.         }  
  19.         else if(2 == un.c[0] && 1 == un.c[1])  
  20.         {  
  21.             printf("little-endian\n");  
  22.             return 1;  
  23.         }  
  24.         else  
  25.         {  
  26.             printf("unknown\n");  
  27.         }  
  28.     }  
  29.     else  
  30.     {  
  31.         printf("sizeof(short) = %d\n"sizeof(short));  
  32.     }  
  33.   
  34.     return 0;  
  35. }  

转:http://my.oschina.net/renhc/blog/37130
阅读(1384) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~