大小端字节序的判断

来源:互联网 发布:js取request中的值 编辑:程序博客网 时间:2024/04/25 10:05

最近要重新研究linux网络编程,首先都遇到这个问题,记录复习下吧~
本文转自:http://blog.chinaunix.net/uid-23069658-id-3271110.html

大小端字节序
小端字节序:little-endian,将低字节存放在内存的起始地址;
大端字节序:big-endian,将高字节存放在内存的起始地址。
例如,数字index=0x11223344,在大小端字节序方式下其存储形式为:

这里写图片描述

上图一目了然的可以看出大小端字节序的区别。

程序实现

#include <stdio.h>#include <stdlib.h>typedef unsigned char u8;typedef unsigned short u16;typedef unsigned long u32;int main(){    printf("short int=%d,char=%d\r\n",sizeof(short int),sizeof(char));    short int x;    char x1,x2;    x = 0x1122;    x1 = ((char *)&x)[0];    //低地址    x2 = ((char *)&x)[1];    //高地址    printf("x1=%x\n",x1);    printf("x2=%x\n",x2);    if(x1 ==0x22)    {       //小端字节序:little-endian,将低字节存放在内存的起始地址;       //大部分电脑都是小端模式        printf("小端字节序\n");       }else    {  //大端字节序:big-endian,将高字节存放在内存的起始地址。         printf("大端字节序\n");    }    system("pause");    return 0;}

在windows 32位编译器上,编译结果:

short int=2,char=1
x1=22
x2=11
小端字节序


总结:
网络字节顺序采用big endian方式。
X86系列CPU都是小端little-endian字节序,即低字节存低位,高字节存高位。

补充:
参考《Unix环境编程》,在windows和ubuntu环境下大小端识别均为小端模式。

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){    union{        short s;        char c[sizeof(short)];    }un;    un.s = 0x0102;    if( sizeof(short) == 2)    {        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("sizeof(short)= %d\n",sizeof(short));     }    return 0;}