大小端问题

大小端是计算机存储信息的不同方式。
大段:内存低地址位存储数据高位,内存高地址位存储数据低位。
小端:内存低地址位存储数据低位,内存高地址位存储数据高位。
举例,32位系统上 int value = 0x12345678
存储在0x0000-0x0003的内存地址上
大端:
0x0000 :  0x12
0x0001 :0x34
0x0002 :0x56
0x0003 :0x78
小端:
0x0000 :  0x78
0x0001 :0x56
0x0002 :0x34
0x0003 :0x12

用代码检验系统大端/小端

//返回值为1为小端,返回值为0为大端
bool CheckEnd() {
    int value = 1;
    return (*((char*)(&value)) == 1);
}

另外,网络字节序也是大端的

小端系统在发送数据和接收数据时需要使用以下htons/htonl 和 ntohs/ntohl 函数转换字节序

//htons
u16_t htons(u16_t value) {
    return (((value & 0xff00)>>8) |    \
                ((value & 0x00ff) << 8));
}

//htonl
u32_t htonl(u32_t value) {
    return (((value & 0xff000000) >> 24) |    \
                ((value & 0x00ff0000) >> 8) |    \
                ((value & 0x0000ff00) << 8) |    \
                ((value & 0x000000ff) <<24));
}

//ntohs
u16_t ntohs(u16_t value) {
    return htons(value);
}

//ntohl
u32_t ntohl(u16_t value) {
    return htonl(value);
}

 

posted @ 2014-04-18 10:36  noanswertome  阅读(231)  评论(0)    收藏  举报