考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有两种方法:

一种是将低序字节存储在起始地址,这称为小端字节序。

另一种方法是将高序字节存储在起初地址,这称为大端字节。

测试程序:

利用union类型 —— 可以利用union类型数据的特点:所有成员的起始地址一致

  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. static union  
  4. {  
  5.     char a[4];  
  6.     unsigned long ul;  
  7. }endian = {{'L', '?', '?', 'B'}};  
  8. #define ENDIAN ((char)endian.ul)  
  9.   
  10. int main()  
  11. {  
  12.     printf("%c/n", ENDIAN);  
  13.     system("pause");  
  14.     return 0;  
  15. }  

  大端模式(Big-endian):数据的低字节存放在高地址中。

  小端模式(Little-endian):数据的低字节存放在低地址中。

  union型数据所占的空间等于其最大的成员所占的空间,对union型成员的存取都是相对于该联合体基地址的偏移量为0处开始,

  即,联合体的访问不论对哪个变量的存取都是从union的首地址位置开始

-----------------------------------------------------------------------------

 

 #include<stdio.h>
 #include<stdlib.h>
 
 int main(int argc, char** argv)
 {
     union{
         short s;
         char c[sizeof(short)];
     }un;
     un.s = 0x0102;\\01是数据的高位字节 02是数据的低位字节
 
     if(2 == sizeof(short))
     {
         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("unkonwn\n");
		 }
     }
     else
     {
         printf("sizeof(short) = %d\n", sizeof(short));
     }
 
     exit(0);
 }

  

字节排序函数:

htons

htonl

ntohs

ntohl

h代表host

n代表network

s代表short

l代表long

只需要调用适当的函数在 主机字节序 和 网络字节序 之间转换某个给定的值,不需要去关心主机字节序和网络字节序的真实值。

posted on 2015-09-07 18:58  邶风  阅读(259)  评论(0编辑  收藏  举报